方式一
logrotate配置分割
logrotate简单介绍
logrotate 是一个 Linux系统日志的管理工具。可以对单个日志文件或者某个目录下的文件按时间 / 大小进行切割,压缩操作;指定日志保存数量;还可以在切割之后运行自定义命令。
下面命令可以查看是否安装了
logrotate --version
/etc/logrotate.conf
是主配置文件, /etc/logrotate.d
文件夹下面是自定义的配置文件
新增切割nginx日志的配置文件
在 /etc/logrotate.d
目录下新增nginx文件
nano nginx_log 写入下面内容(我的日志文件目录是/usr/local/nginx/logs/)
/usr/local/nginx/logs/
/usr/local/nginx/logs/*.log {
daily # 按天分割
rotate 30
create
sharedscripts # 所有的文件切割之后只执行一次下面脚本,通知nginx重新打开新的日志文件进行后续写入
postrotate
if [ -f /usr/local/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` # 通过USER1信号通知nginx重新打开日志文件
fi
endscript
}
如果报错则删掉注释
这样就会每天定时分割日志了
也可以手动执行命令测试一下能否正常分割日志
logrotate -f /etc/logrotate.d/nginx
修正配置文件后,您需要通知 logrotate 重新读取配置文件,或者重新启动 logrotate 服务。在大多数Linux系统中,您可以使用以下命令来重新启动 logrotate:
sudo service logrotate restart
或者,如果您使用的是基于systemd的系统,可以使用:
sudo systemctl restart logrotate
又或者
logrotate是属于rsyslog里的其中一个服务重启的方法:
CentOS6命令:service rsyslog restart
CentOS7命令:systemctl restart rsyslog
另外,可以手动执行分隔命令进行测试【以nginx的为例】
logrotate -f /etc/logrotate.d/nginx
确保您的 logrotate 配置文件格式正确,并且没有语法错误。您可以通过运行 logrotate -d /etc/logrotate.d/nginx_log
来测试配置文件,而不实际执行轮换,-d 参数可以输出 logrotate 执行时的调试信息。
在修改配置文件并重新启动 logrotate 服务之后,错误应该不会再出现,日志文件将按照新的配置进行管理。
调试模式下的输出显示了以下信息:
logrotate 正在读取配置文件 /etc/logrotate.d/nginx_log。
logrotate 正在考虑轮换位于 /usr/local/nginx/logs/ 目录下的日志文件,具体是匹配 /usr/local/nginx/logs/*.log 的所有文件。
对于每个日志文件,logrotate 检查是否满足轮换条件。在这个例子中,配置似乎是每天轮换一次日志(after 1 days (30 rotations)),意味着每天都会执行轮换。
logrotate 检查了 access.log 和 error.log 文件,并且发现它们在 2024-05-15 08:30 已经被轮换过,因此它们不需要再次轮换,因为还没有到下一次轮换的时间(即还没有过去一整天)。
由于没有日志文件满足轮换条件,logrotate 没有执行 postrotate 脚本。
如果您希望 logrotate 实际执行轮换操作,而不是仅仅以调试模式运行,您应该使用 -v 参数(verbose,详细模式)来获取详细的输出,但不会更改实际的行为。例如:
logrotate -v /etc/logrotate.d/nginx_log
方式二
定时任务执行分割脚本
创建一个sh文件,写入以下内容(个别内容根据自己nginx的情况修改)
我这里的文件为 /usr/local/nginx/log_bak.sh
#/bin/bash
yesterday=$(date +%Y-%m-%d) #取得服务器当前时间
savepath_log=' /var/log/nginx_bak'#分割后的日志文件保存目录(注意结尾目录斜杠去掉)
nglogs='/usr/local/nginx/logs' #nginx日志文件目录,具体根据实际地址替换(结尾目录斜杠去掉 以免与下面路径中的"/"重复)
#判断分割日志保存目录是否存在不存在则创建
if [ ! -d ${savepath_log} ] # 注意 语句之间 空格不可省略,这是bash脚本 不是php脚本那样随和
then
mkdir -p ${savepath_log}
fi
#通过mv命令将日志移动到分割后的日志目录里,然后发送kill -USR1信号给Nginx的主进程号,让Nginx重新生成一个新的日志文件。
mv ${nglogs}/access.log ${savepath_log}/access_${yesterday}.log #具体根据你的实际日志文件名路径 进行修改access.log名字
mv ${nglogs}/error.log ${savepath_log}/error_${yesterday}.log #具体根据实际日志文件名地址 修改error.log名字
mv ${nglogs}/host.access.log ${savepath_log}/host.access_${yesterday}.log
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid) #通知nginx重新生成新的日志
添加定时任务
crontab -e #后添加下面内容
59 23 * * * /usr/local/nginx/log_bak.sh(自己写的脚本的路径)
这样每天的23点59就会将当天的日志进行备份,并生成新的日志文件继续记录访问日志
方式三
手动切割日志
如果您更喜欢手动管理日志,或者没有使用 logrotate,您可以编写一个自定义的脚本来切割 NGINX 日志。这个脚本可以运行 gzip 来压缩旧的日志文件,然后创建一个新的日志文件。
#!/bin/bash
gzip /var/log/nginx/access.log
gzip /var/log/nginx/error.log
touch /var/log/nginx/access.log
touch /var/log/nginx/error.log
chown www-data:adm /var/log/nginx/access.log /var/log/nginx/error.log
路径以实际为准。
评论 (0)