• 对于注定会优秀的人来说,他所需要的,只是时间!
  • 手懒得,必受贫穷,手勤的,必得富足----《圣经》
  • 帮助别人,成就自己。愿君在本站能真正有所收获!
  • 如果你在本站中发现任何问题,欢迎留言指正!
  • 宝剑锋从磨砺出,梅花香自苦寒来!

从NGINX自身配置文件中定义访问日志按时间切割

Nginx eryajf 7个月前 (12-18) 682°C 已收录 0个评论
本文预计阅读时间 8 分钟

以往NGINX日志不会进行切割的操作,而都是把切割的工作交给logrotate来做了,这没啥问题,但是如果遇到NGINX是容器来跑的,日志只是挂载出来的情况,就有点不科学了,毕竟logrotate在切割日志的时候还需要发一个平滑滚动的信号给NGINX进程。

那么这里就分享基于NGINX自身配置文件来进行日志的切割工作:

if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
    set $year $1;
    set $month $2;
    set $day $3;
}

access_log /var/log/nginx/$year-$month-$day-access.log;

以上配置基于 $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 /data/log/test/nginx-access-$year-$month-$day-$hour-$minutes-$seconds.log json;

这样就已经可以实现需求了,还有Perl的表现方式,这里就不讲解了。

注意:这里的if语句只能放到server区块下,所以不能直接放在全局引用。

于是,可以先创建一个日志格式化专用的配置文件:

$ vim /usr/local/nginx/conf/log_format.conf

log_format json escape=json '{"remote_addr": "$remote_addr",'
                                 '"@timestamp": "$time_iso8601",'
                                 '"request_uri": "$request_uri",'
                                 '"verb": "$request_method",'
                                 '"httpversion": "$server_protocol",'
                                 '"response": "$status", '
                                 '"body_bytes_sent": "$body_bytes_sent", '
                                 '"referrer": "$http_referer", '
                                 '"user_agent": "$http_user_agent", '
                                 '"http_x_forwarded_for": "$http_x_forwarded_for", '
                                 '"server_name": "$host",'
                                 '"request_time": "$request_time",'
                                 '"upstream_response_time": "$upstream_response_time",'
                                 '"realpath_root": "$realpath_root",'
                                 '"request_body": "$request_body",'
                                 '"nginx_version": "$nginx_version",'
                                 '"scheme": "$scheme"}';

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;
}
access_log /home/nginx/logs/${server_name}-${year}-${month}-${day}-${hour}_access.log json;

然后再在配置当中引用进来:

$ cat doc.conf

server {
    listen       80;
    server_name  doc.eryajf.net;
    charset utf-8;
    include log_format.conf;
    location / {
        try_files /_not_exists_ @backend;
    }
    location @backend {
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host            $http_host;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:8180;
    }
}

这样日志就会根据不同域名,按每小时一个文件的进行分割了。

注意:如果配置之后日志没有新生成,检查一下NGINX进程是否有对应目录的写入权限,并请求一下NGINX,应该就会有日志产生了。


weinxin
扫码订阅本站,第一时间获得更新
微信扫描二维码,订阅我们网站的动态,另外不定时发送WordPress小技巧,你可以随时退订,欢迎订阅哦~

二丫讲梵 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明从NGINX自身配置文件中定义访问日志按时间切割
喜欢 (0)
[如果想支持本站,可支付宝赞助]
分享 (0)
eryajf
关于作者:
学无止境,我愿意无止境学。书山有路,我愿意举身投火,淬炼成金!永远不要忘记,激情的奋进,就是美好的未来!

您必须 登录 才能发表评论!