Nginx 修改 access log 按日期保存记录

阅读 (6095)
网络流传的nginx access log分割都是写shell脚本然后做定时任务来分割日志,操作中自由度比较高,可以用正则按需要分割日志,但如果只是想按日期保存日志,可以用以下方法
server
{
   ……
   #从系统时间中正则匹配出年月日
   if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
      set $date $1$2$3;
   }
   
   # 日期记录日志
   access_log  /home/wwwlogs/www-test-com/$date-access.log;
}

注意一点,如果自己新增的日志目录,请保证目录可被nginx用户组有写入权限

例:如果用root账号创建了www-test-com, nginx用户组为 www:www,那按上面的方法应该是无法正常写入文件的

先将www-test-com目录用户组改为 www:www

cd /home/wwwlogs
chown -R www:www www-test-com

我的服务器 nginx version: nginx/1.12.1 测试该方法可用

更详细的日期变量设置,按需使用

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;
}

据说还有Perl方法捕获日期变量,不过本人没有试过,有兴趣的可以试试

if ($time_iso8601 ~ "^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})") {}

# 日期记录日志
access_log  /home/wwwlogs/www-test-com/$year$month$day-access.log;

配合定时任务删除n天前的日志

先创建 .sh脚本

cd ~
vi clearLogs.sh

添加内容

 #!/bin/bash

find /home/wwwlogs/www-test-com/ -mtime +10 -name "*.log" -exec rm -rf {} \;

说明:将/home/wwwlogs/www-test-com/目录下所有10天前带".log"的文件删除。
具体参数说明如下:
find:linux的查找命令,用户查找指定条件的文件;
/home/wwwlogs/www-test-com/:想要进行清理的任意目录;
-mtime:标准语句写法;
+10:查找10天前的文件,这里用数字代表天数;
"*.log":希望查找的数据类型,"*.jpg"表示查找扩展名为jpg的所有文件,"*"表示查找所有文件,这个可以灵活运用,举一反三;
-exec:固定写法;
rm -rf:强制删除文件,包括目录;
{} \; :固定写法,一对大括号+空格+\+;

#执行命令
crontab -e

#添加代码每天下午1点定时执行脚本
00 13  * * * /root/clearLogs.sh

 

更新于:2017-11-28 20:39:55
返回顶部