nginx 日志介绍
nginx
有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module
的支持,日志格式通过 log_format
命令来定义,日志对于统计和排错是非常有利的,下面总结了 nginx
日志相关的配置 包括 access_log
、rewrite_log
、error_log
。
# 设置访问日志
access_log path 样式;
access_log
作用域
可以应用access_log
指令的作用域分别有http
,server
,location
,也就是说,在这几个作用域外使用该指令,Nginx会报错。
# 该例子指定日志的写入路径为`/var/logs/nginx-access.log`,日志格式使用默认的`combined`:
access_log /var/logs/nginx-access.log combined;
log_format 指令
Nginx 预定义了名为 main
日志格式,如果没有明确指定日志格式将默认使用该格式:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
如果不想使用Nginx预定义的格式,可以通过
log_format
指令来自定义:# 语法: log_format name [escape=default|json] string ...;
name 格式名称。在 access_log 指令中引用。
escape 设置变量中的字符编码方式是
json
还是default
,默认是default
。string 要定义的日志格式内容。该参数可以有多个。参数中可以使用Nginx变量。
log_format
指令中常用的一些变量:
下面是log_format指令中常用的一些变量:
$bytes_sent:发送给客户端的总字节数
$body_bytes_sent:发送给客户端的字节数,不包括响应头的大小
$connection:连接序列号
$connection_requests:当前通过连接发出的请求数量
$mses:日志写入时间,单位为秒,精度是毫秒
$pipe:如果请求是通过http流水线发送,则其值为“p”,否则为“.”
$request_length:请求长度
$request_time:请求处理时长
$status:响应状态码
$time_iso8601:标准格式的本地时间
$time_local:通用日志格式下的本地时间
$http_referer:请求的referer地址
$http_user_agent:客户端浏览器信息
$remote_addr:客户端IP
$http_x_forwarded_for:当前端有代理服务器时,记录web节点记录客户端地址的配置
$request:完整的原始请求行
$remote_user:客户端用户名称
$request_url:完整的请求地址
————————————————
版权声明:本文为CSDN博主「海龟同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ykyk0524/article/details/119745052
自定义日志格式的使用
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/logs/nginx-access.log main;
server {
}
使用log_format
指令定义了一个main
的格式,并在access_log
指令中引用了它。假如客户端有发起请求看一下我截取的一个请求的日志记录:
39.149.31.187 - - [12/Mar/2020:12:24:02 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0;
Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" "-"
我们看到最终的日志记录中$remote_user
、$http_referer
、$http_x_forwarded_for
都对应了一个-
,这是因为这几个变量为空。
error_log
错误日志在Nginx中是通过error_log
指令实现的。该指令记录服务器和请求处理过程中的错误信息。
语法:
配置错误日志文件的路径和日志级别。error_log file [level]; Default: error_log logs/error.log error;
file
参数指定日志的写入位置。level
参数指定日志的级别。level可以是debug
,info
,notice
,warn
,error
,crit
,alert
,emerg
中的任意值。可以看到其取值范围是按紧急程度从低到高排列的。只有日>志的错误级别等于或高于level指定的值才会写入错误日志中。
基本用法
error_log /var/log/nginx/error.log;
配置段:http
, mail
, stream
, server
, location
作用域。
例子中指定了错误日志的路径为:/var/log/nginx/error.log
,日志级别使用默认的 error
。
rewrite_log
由ngx_http_rewrite_module
模块提供的。用来记录重写日志的。对于调试重写规则建议开启,启用时将在error log
中记录重写日志。
基本语法:
rewrite_log on | off;
默认值:
rewrite_log off;
配置段: http
, server
, location
, if
作用域。
nginx 日志配置总结
Nginx中通过access_log
和error_log
指令配置访问日志和错误日志,通过log_format
我们可以自定义日志格式。如果日志文件路径中使用了变量,我们可以通过open_log_file_cache
指令来设置缓存,提升性能。其他的根据自己的使用场景定义。
自定义日志文件名
每个server一个日志文件
server {
listen 8001;
set $vhost $server_name;
server_name 域名;
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
}
access_log /var/log/nginx/${server_name}_${server_port}/${year}-${month}-${day}_access.log main;
}
nginx的日志文件分割
cron定时任务参考:https://liuhuiyao.blog.csdn.net/article/details/125215585
logrotate分割
logrotate分割日志参考Nginx利用Logrotate实现日志分割的详细过程_nginx_脚本之家
Linux下logrotate命令使用.配置和理解_logrotate -f_junli_chen的博客-CSDN博客
利用Linux自带的logrotate管理日志_logrotate maxage_it-wangxiaobai的博客-CSDN博客
logrotate /etc/logrotate.conf:重新读取配置文件,并对符合条件的文件文件进行rotate。
logrotate -d /etc/logrotate.conf:调试模式,输出调试结果,但并不执行。
logrotate -f /etc/logrotate.conf:强制模式,对所有相关文件进行rotate。
demo1 logrotate.conf 统一扫描配置
/usr/sbin/logrotate -f /etc/logrotate.conf 每次执行都会读取/etc/logrotate.d/下得所有配置,并作响应处理。
# 查看日志所在位置
[root@localhost ~]# rpm -ql nginx |grep log
/etc/logrotate.d/nginx
/var/log/nginx
[root@localhost ~]# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log { # 指定需要轮转处理的日志文件
su root root #指定的账户
daily # 日志文件轮转周期,可用值为: daily/weekly/yearly
missingok # 忽略错误信息
rotate 7 # 轮转次数,即最多存储7个归档日志,会删除最久的归档日志
minsize 5M #限制条件,大于5M的日志文件才进行分割,否则不操作
dateext # 以当前日期作为命名格式
compress # 轮循结束后,已归档日志使用gzip进行压缩
delaycompress # 与compress共用,最近的一次归档不要压缩
notifempty # 日志文件为空,轮循不会继续执行
create 640 nginx nginx # 新日志文件的权限
sharedscripts # 有多个日志需要轮询时,只执行一次脚本
postrotate # 将日志文件转储后执行的命令。以endscript结尾,命令需要单独成行
if [ -f /var/run/nginx.pid ]; then # 判断nginx的PID。# 默认logrotate会以root身份运行
kill -USR1 cat /var/run/nginx.pid
fi
endscript
}
# 执行命令: 此命令(加-f)每次执行,都会读取/etc/logrotate.d/下得所有配置,并强制rotate一个文件,按照配置备份当前得文件,并生成新的日志文件。
[root@localhost ~]# /usr/sbin/logrotate -f /etc/logrotate.conf
# 创建计划任务:
[root@localhost ~]# crontab -e
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.conf
当然,可以不用再配置cron定时任务,因为Logrotate是基于CRON来运行的,其cron脚本是/etc/cron.daily/logrotate,/etc/cron.daily下的任务会每天会自动跑一次。 参考
https://cloud.tencent.com/developer/article/1681716
上述定时任务执行得 /usr/sbin/logrotate -f /etc/logrotate.conf ,每次都会扫描/etc/logrotate.d/下所有配置文件 并检查执行相关规则。
(推荐)demo2,nginx 单独的logrotate,单独得定时任务,按日分割,保留7天
确保日志文件在/usr/local/nginx/logs目录下,当前demo,在/usr/local/nginx/logs/下有access.log ,error.log两个文件,archive目录 用于存储每天的归档文件。
创建/usr/local/nginx/conf/logrotate-nginx.conf。logrotate-nginx.conf叫什么名字都无所谓,可以是xxxx
#确保日志在此目录下
/usr/local/nginx/logs/* {
su root root
daily
dateext
rotate 7
maxage 7
olddir archive
missingok
nocreate
sharedscripts
postrotate
test ! -f /var/run/nginx.pid || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
创建定时任务
在/etc/cron.d下创建cron脚本,
nginx.c
55 23 * * * root sleep `perl -e "print int(rand(120))"` && mkdir -p /usr/local/nginx/logs/archive && /usr/sbin/logrotate -v -f /usr/local/nginx/conf/logrotate-nginx.conf
或者 root用户下 crontab -e (推荐),然后添加
59 23 * * * /usr/sbin/logrotate -f /usr/local/nginx/conf/logrotate-nginx.conf
重启cron
service crond reload
service crond restart
/sbin/service crond start #启动服务
/sbin/service crond stop #关闭服务
/sbin/service crond restart #重启服务
/sbin/service crond reload #重新载入配置
看日志
demo3,nginx配置文件方式
按日分割日志
打开 conf\nginx.conf
#这边是自定义变量,从 $time_iso8601 这个变量中截取,以供后续使用
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
set $hour $4;
set $minutes $5;
set $seconds $6;
}
access_log logs/access-$year-$month-$day.log;
这样在Logs中就会生成 名称为 access_2020-12-25.log 的日志了,当然也可以自行改成自己喜欢的。
start nginx 启动文章来源:https://www.toymoban.com/news/detail-698793.html
nginx -s stop 快速停止文章来源地址https://www.toymoban.com/news/detail-698793.html
到了这里,关于nginx 日志,格式化,存储,按日切割的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!