前言
接到研发这样一个需求,希望将启动微服务日志 nohup.out 进行切分,因为时间长了,日志会堆积很多无法查阅。
我问:微服务不是可以每天生成一个日志来以日期进行切分吗?
研发回答:有些报错信息程序无法获取并写入到日志文件中,所以 nohup.out 日志还是需要的。
基于以上原因,决定来处理下 nohup.out 的日志切分。
logrotate切分nohup
以前也用过 logrotate 为 nginx 做过切分,这里就不再详细描述了。
直接写 logrotate 脚本:
[root@localhost ~]# vim /etc/logrotate.d/app_service
/data/app-1/nohup.out
/data/app-2/nohup.out
/data/app-3/nohup.out
{
create 0644
daily
dateext
rotate 3
missingok
notifempty
copytruncate
compress
}
解析:
需要切分的多个日志文件:
/data/app-1/nohup.out
/data/app-2/nohup.out
/data/app-3/nohup.out
create 0644 - 以指定的权限创建全新的日志文件
daily - 日志文件切割频率 daily: 每日,monthly: 每月,weekly: 每周,yearly: 每年
dateext - 使用日期作为命名格式
rotate 10 - 一次将存储10个归档日志,对于第11个归档,时间最久的归档将删除
missingok - 在日志轮询期间,任何错误将被忽略,例如:文件无法找到 之类的错误
notifempty - 如果文件为空,将不会对日志进行归档
copytruncate - 把当前log拷贝后截断。可以理解为把内容拷贝走作为备份,然后清空当前文件。但是这有一个问题就是拷贝和截断之间会有时间差,存在丢数据的可能。
compress - 在日志归档之后,对日志进行gzip压缩
测试
下面信息没有出现报错就OK
[root@localhost ~]# logrotate -d -f /etc/logrotate.d/app_service
reading config file /etc/logrotate.d/app_service
Allocating hash table for state file, size 15360 B
Handling 1 logs
rotating pattern: /data/app-1/nohup.out
/data/app-2/nohup.out
/data/app-3/nohup.out
forced from command line (3 rotations)
empty log files are not rotated, old logs are removed
considering log /data/app-1/nohup.out
log needs rotating
considering log /data/app-2/nohup.out
log needs rotating
considering log /data/app-3/nohup.out
log needs rotating
rotating log /data/app-1/nohup.out, log->rotateCount is 3
dateext suffix '-20210324'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
copying /data/app-1/nohup.out to /data/app-1/nohup.out-20210324
truncating /data/app-1/nohup.out
compressing log with: /bin/gzip
rotating log /data/app-2/nohup.out, log->rotateCount is 3
dateext suffix '-20210324'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
copying /data/app-2/nohup.out to /data/app-2/nohup.out-20210324
truncating /data/app-2/nohup.out
compressing log with: /bin/gzip
rotating log /data/app-3/nohup.out, log->rotateCount is 3
dateext suffix '-20210324'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
copying /data/app-3/nohup.out to /data/app-3/nohup.out-20210324
truncating /data/app-3/nohup.out
compressing log with: /bin/gzip
强制执行一次,主要是为了检测:
[root@localhost ~]# logrotate -f /etc/logrotate.d/app_service
### 查看备份 ###
[root@localhost ~]# tree -a /data/
/data/
├── app-1
│ ├── nohup.out
│ ├── nohup.out-20210324.gz
│ └── test.sh
├── app-2
│ ├── nohup.out
│ ├── nohup.out-20210324.gz
│ └── test.sh
├── app-3
│ ├── nohup.out
│ ├── nohup.out-20210324.gz
│ └── test.sh
└── test.sh
3 directories, 10 files
这里是通过手动来触发的,logrotate 是如何自动触发呢?
[root@localhost ~]# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
通过上面定义,logrotate
是通过 crond
每日来触发的,因此只要保证 crond
启动,logrotate 就会每日执行一次。
【完】