1、访问日志
access_log off; # 默认值为off
access_log logs/access.log combined; # 参数path,设置日志输出的文件路径或syslog服务器地址。
access_log logs/log.gz combined gzip flush=5m;
map $status $loggable {
~^[23] 0;
default 1;
}
access_log logs/access.log combined if=$loggable;
参数 | 说明 |
---|---|
path | 设置日志输出的文件路径或syslog服务器地址 |
format | 设置关联log_format指令定义的日志格式名 |
buffer | 设置日志文件缓冲区大小。当缓冲区日志数据超出该值时,缓冲区日志数据会被写到磁盘文件。默认缓冲区大小为64KB |
flush | 设置日志缓冲区刷新的时间间隔,缓冲区日志的保护时间超过这个设定值时,缓冲区日志数据会被写到磁盘文件 |
gzip | 设置缓冲区数据的压缩级别,缓冲区数据会被压缩后再写出到磁盘文件。压缩级别范围1~9,级别越高压缩比越高,系统资源消耗也最大,默认级别为1 |
if | 设置是否记录日志,当参数值的条件成立,即不为0或空时,才记录日志。 |
2、错误日志
error_log syslog:server=192.168.2.109 error;
error_log memory:32m debug;
error_log /dev/null;
# 访问文件不存在时,记入错误日志
log_not_found on;
级别 | 级别值 | 级别说明 |
---|---|---|
debug | 8 | 代码中标记为NGX_LOG_DEBUG的输出,输出作为详细,配合调试使用 |
info | 7 | 代码中标记为NGX_LOG_INFO的输出,因包括除debug级别的所有输出,故同样会消耗大量磁盘IO资源 |
notice | 6 | 代码中标记为NGX_LOG_NOTICE的输出 |
warn | 5 | 代码中标记为NGX_LOG_WARN的输出 |
error | 4 | 代码中标记为NGX_LOG_ERROR的输出,实际生产环境中常用的输出级别 |
crit | 3 | 代码中标记为NGX_LOG_CRIT的输出 |
alert | 2 | 代码中标记为NGX_LOG_ALERT的输出 |
emery | 1 | 代码中标记为NGX_LOG_EMERY的输出 |
3、日志格式
Nginx的日志输出位置及内容格式是通过access_log及error_log指令配置实现的。Nginx日志默认是文本格式,通过Nginx提供的log_format可以输出为json格式,并支持自定义日志输出的内容。
默认的日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format json '{"@timestamp": "$time_iso8601", '
'"connection": "$connection", '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"request_method": "$request_method", '
'"request_uri": "$request_uri", '
'"server_protocol": "$server_protocol", '
'"status": "$status", '
'"body_bytes_sent": "$body_bytes_sent", '
'"http_referer": "$http_referer", '
'"http_user_agent": "$http_user_agent", '
'"http_x_forwarded_for": "$http_x_forwarded_for", '
'"request_time": "$request_time"}';
TCP/UDP代理的访问日志
# 普通格式日志
log_format tcp '$remote_addr - $connection - [$time_local] $server_addr: $server_port '
'- $status - $upstream_addr - $bytes_received - $bytes_sent - $session_time '
'- $proxy_protocol_addr:$proxy_protocol_port ';
# JSON格式日志
log_format json '{"@timestamp": "$time_iso8601", '
'"connection": "$connection", '
'"remote_addr": "$remote_addr", '
'"server_addr": "$server_addr:$server_port" '
'"status": "$status" '
'"upstream_addr": "$upstream_addr" '
'"bytes_received": "$bytes_received" '
'"bytes_sent": "$bytes_sent" '
'"session_time": "$session_time" '
'"proxy_protocol_addr": "$proxy_protocol_addr:$proxy_protocol_port" '}'
4、日志格式可用变量
变量 | 含义 |
---|---|
$remote_addr | 记录客户端IP地址 |
$remote_user | 记录客户端用户名 |
$time_local | 记录通用的本地时间 |
$time_iso8601 | 记录ISO8601标准格式下的本地时间 |
$request | 记录请求的方法以及请求的http协议 |
$status | 记录请求状态码(用于定位错误信息) |
$body_bytes_sent | 发送给客户端的资源字节数,不包括响应头的大小 |
$bytes_sent | 发送给客户端的总字节数 |
$msec | 日志写入时间。单位为秒,精度是毫秒。 |
$http_referer | 记录从哪个页面链接访问过来的 |
$http_user_agent | 记录客户端浏览器相关信息 |
$http_x_forwarded_for | 记录客户端IP地址 |
$request_length | 请求的长度(包括请求行,请求头和请求正文)。 |
$request_time | 请求花费的时间,单位为秒,精度毫秒 |
5、日志输出到syslog
Nginx的访问日志和错误日志都支持将日志直接输出到syslog服务端
error_log syslog:server=192.168.1.1 debug;
access_log syslog:server=unix:/var/log/nginx.sock,nohostname;
access_log syslog:server=[2001:db8::1]:12345,facility=local7,tag=nginx,severity=info combined;
参数 | 说明 |
---|---|
server | 设置syslog服务器的地址,可以是IP、域名或UNIX套接字,默认端口514 |
facility | 日志消息模块,默认为local7 |
severity | 日志严重级别,默认为info。error_log指令时,由其第二个参数设置该值,所以此参数被忽略 |
tag | 设置标签,默认为nginx |
nohostname | 不将hostname字段添加到syslog消息头 |
6、日志输出到docker控制台
我们知道,Docker 容器的日志是需要打印到控制台上才能被有效采集的,至少这是官方的日志输出方案。实际工作中,常用命令 docker logs 打印出的也正是 Docker 容器在控制台上输出的信息。但现实环境下,大多数应用都会把日志输入到文件中,这给应用的容器化带来了一些困扰。要实现日志打印到控制台,我们可以通过软链接重定向日志到控制台
假设我们的日志文件于:/var/log/demo_access.log、/var/log/demo_server.log、/var/log/demo_error.log
我们可以通过执行如下命令将其重定向到控制台:
# ln -sfT /dev/stdout "/var/log/demo_access.log"
# ln -sfT /dev/stdout "/var/log/demo_server.log"
# ln -sfT /dev/stderr "/var/log/demo_error.log"
参数 | 说明 |
---|---|
-s, --symbolic | make symbolic links instead of hard links |
-f, --force | 强行删除任何已存在的目标文件 |
-T, --no-target-directory | treat LINK_NAME as a normal file always |
这些命令甚至可以直接在 Dockerfile 内预置,容器构建好运行时就能顺利将日志打印到控制台了!
ln -sf /dev/stdout /var/log/nginx/access.log \
ln -sf /dev/stderr /var/log/nginx/error.log \
评论区