nginx 日志之 access_log分割

本文介绍如何通过shell脚本和系统日志切割机制管理Nginx日志,包括每日生成新日志、旧日志压缩及删除,以及使用logrotate进行日志切割的配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果任由访问日志写下去,日志文件会变得越来越大,甚至是写满磁盘。

所以,我们需要想办法把日志做切割,比如每天生成一个新的日志,旧的日志按规定时间删除即可。

实现日志切割可以通过写shell脚本或者系统的日志切割机制实现。

 

shell脚本切割Nginx日志

切割脚本内容:
#!/bin/bash
logdir=/var/log/nginx #定义日志路径
prefix=`date -d "-1 day" +%y%m%d` #定义切割后的日志前缀
cd $logdir 
for f in `ls access.log`
do
mv $f $f-$prefix #把日志改名
done
/bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null #生成新的日志
bzip2 *$prefix #压缩日志
find . -type f -mtime +180 |xargs /bin/rm -f #删除超过180天的老日志

示例:

#!/bin/bash
logdir=/usr/local/nginx/logs/
prefix=`date -d "-1 day" +%y%m%d`
cd $logdir
for f in `ls access.log`
do
mv $f $prefix-$f
done
/bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null
find . -type f -mtime +180 |xargs /bin/rm -f 

 

系统日志切割机制

在/etc/logrotate.d/下创建nginx文件,内容为:
/data/logs/access.log {
daily
rotate 30
missingok
notifempty
compress
sharedscripts
postrotate
/bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || :
endscript
}

说明:
  nginx日志在/data/logs/目录下面,日志名字以log结尾
  daily表示每天切割
  rotate 30表示日志保留30天
  missingok表示忽略错误
  notifempty表示如果日志为空,不切割
  compress表示压缩
  sharedscripts和endscript中间可以引用系统的命令
  postrotate表示当切割之后要执行的命令

 附:

1.如何测试logrotate程序执行的情况

答:/usr/sbin/logrotate -d /etc/logrotate.d/nginx 

2.怎么查看log文件的具体执行情况

答:cat /var/lib/logrotate/status

3.使用-v或-d参数时,显示log does not need rotating

答:logrotate在对status未记录的文件进行转储时,会在status添加一条该文件的记录,并将操作时间设为当天。之后程序再次对此文件进行转储时发现这个文件今天已经操作过,就不再进行相关操作。

解决方法:

1. vi /var/lib/logrotate/status 更改相对应的文件操作日期

2. 使用-s指定状态文件

3.分割日志时报错:error: skipping "/var/log/nginx/test.access.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.

答:添加“su root list”到/etc/logrotate.d/nginx文件中即可

如下:

/var/log/nginx/*.log {

su root list

daily

missingok

rotate 52

compress

delaycompress

notifempty

#ifempty

create 0640 www-data adm

sharedscripts

postrotate

[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`

endscript

}

转载于:https://www.cnblogs.com/yyxianren/p/10843065.html

<think>嗯,用户想了解Nginx配置文件中access_log指令的具体用法,还要求详细说明和配置示例。首先,我需要回忆一下access_log的基本作用,它是用来记录客户端请求的日志的。然后,我得考虑它的语法结构,比如路径、格式和条件这些参数。 接下来,用户可能需要知道如何配置不同的日志格式,比如使用main或者自定义格式。还要提到作用域,这个指令可以用在http、server、location块里,不同位置的配置会有优先级问题,这点很重要,不能搞错。 然后,配置示例部分应该给出几个常见场景,比如基本的访问日志、按天分割日志、条件记录和不同格式的日志。这些示例要具体,让用户能直接复制使用。另外,要提到日志分析工具,比如awk和GoAccess,这样用户知道如何处理生成的日志。 还要注意引用的问题,用户提供的几个引用链接中,引用[1]、[2]、[4]都涉及access_log的配置和统计,需要正确对应到回答里。比如路径配置、按天分割的方法,这些在引用里都有提到,要确保信息准确。 可能用户没有明说但需要知道的是如何优化日志记录,比如关闭日志、按条件记录来减少磁盘IO,或者如何做日志轮转。这些高级用法可以作为补充内容,帮助用户更全面地应用access_log指令。 最后,生成的相关问题要围绕access_log展开,比如路径管理、格式自定义、日志分析、性能优化、按时间分割和权限相关的问题,这样能引导用户进一步深入学习。需要确保每个问题都有对应的知识点,并且引用正确的参考资料。</think>### Nginx access_log指令详解 #### 一、指令作用 access_log指令用于记录客户端请求的访问日志,包含请求时间、客户端IP、响应状态等关键信息,是进行流量分析、故障排查的基础工具[^1][^4]。 #### 二、指令语法 ```nginx access_log path [format [buffer=size] [gzip=level] [flush=time] [if=condition]]; ``` 或关闭日志记录: ```nginx access_log off; ``` - `path`:日志文件存储路径(支持变量) - `format`:指定日志格式(默认使用combined格式) - `buffer`:设置内存缓冲区大小 - `gzip`:启用日志压缩(1-9级压缩比) - `if`:条件记录 #### 三、作用范围 可配置于以下上下文: - http - server - location (注意:子块配置会覆盖父块配置) #### 四、配置示例 1. **基础配置** ```nginx http { log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; server { access_log /var/log/nginx/access.log main; } } ``` 2. **按天分割日志** ```nginx server { access_log /var/log/nginx/access_$year-$month-$day.log main; # 需配合crontab定时任务进行日志切割[^4] } ``` 3. **条件记录** ```nginx # 仅记录4xx/5xx错误 map $status $loggable { ~^[23] 0; default 1; } server { access_log /var/log/nginx/errors.log main if=$loggable; } ``` 4. **缓冲写入** ```nginx access_log /var/log/nginx/access.log main buffer=32k gzip=5 flush=5m; ``` #### 五、日志分析 常用分析命令: ```bash # 统计访问量TOP10 awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -n 10 # 使用GoAccess可视化分析 goaccess access.log -o report.html --log-format=COMBINED ``` #### 六、高级技巧 1.日志输出 ```nginx server { access_log /var/log/nginx/basic.log; access_log /var/log/nginx/debug.log debug_format; } ``` 2. 性能优化建议 - 生产环境建议保持buffer=64k - 高并发场景可设置`open_log_file_cache` - 调试完成后及时关闭debug日志
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值