网络流传的nginx access log分割都是写shell脚本然后做定时任务来分割日志,操作中自由度比较高,可以用正则按需要分割日志,但如果只是想按日期保存日志,可以用以下方法

server
{

   #从系统时间中正则匹配出年月日

   if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
      set $date $1$2$3;
   }
   
   # 日期记录日志
   access_log  /usr/local/nginx/logs/www-test-com/$date-access.log;
}

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

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

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

cd /usr/local/nginx/logs
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  /usr/local/nginx/logs/$year$month$day-access.log;

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

先创建 .sh脚本

cd ~
vi clearLogs.sh

添加内容

#!/bin/bash

find /usr/local/nginx/logs  -mtime +1 -name "*.log" -exec rm -rf {} \;

说明:将/usr/local/nginx/logs目录下所有10天前带".log"的文件删除。
具体参数说明如下:

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

执行命令

crontab -e

添加代码每天凌晨3点定时执行脚本

0 3  * * * /root/clearLogs.sh




最后修改:2019 年 01 月 18 日
如果觉得我的文章对你有用,请随意赞赏