网络流传的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