Nginx 日志按天分割
2019-12-14 tech nginx 2 mins 995 字
nginx 日志分割是比较常见的运维工作,关于这方面的文章也很多,通常无外乎两种做法:
- cron定期执行shell脚本对日志文件进行归档。
- 使用专门日志归档logrotate。
以上方式与nginx其实没有特别的关系。 从nginx 0.7.6 版本开始,access_log
的路径配置可以包含变量,我们以此进行日志分割。
同时我们基于nginx的 timeiso8601 内嵌变量来获取时间。time_iso8601格式如下:
2018-09-21T16:01:02+02:00
然后使用正则表达式来获取所需时间的数据。
http {
log_format default_format '$remote_addr - $remote_user [$time_iso8601] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_body"';
server {
listen 443 ssl;
... ...
if ($time_iso8601 ~ '(\d{4}-\d{2}-\d{2})') {
set $tttt $1;
}
access_log /log/blog_access_$tttt.log;
}
}
主要关注两个地方:
- 要在外方法的log_format上添加
$time_iso8601
,将原来的time_local修改为time_iso8601。 - 在单个server中,通过正则表达式截取 $time_iso8601 生成时间戳。
最后插一个话题,你知道 $time_iso8601
为什么叫这个名字吗?
国际标准ISO 8601,是国际标准化组织的日期和时间的表示方法,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》。目前是2004年12月1日发行的第三版“ISO8601:2004”以替代1998年的第一版“ISO8601:1998”与2000年的第二版“ISO8601:2000”。