Linux logrotate命令
1、介绍
logrotate: 轮替;管理记录文件 rotate: (使)旋转;(使)转动
Linux logrotate命令用于管理记录文件。使用logrotate指令,可让你轻松管理系统所产生的记录文件。它提供自动替换,压缩,删除和邮寄记录文件,每个记录文件都可被设置成每日,每周或每月处理,也能在文件太大时立即处理。您必须自行编辑,指定配置文件,预设的配置文件存放在/etc目录下,文件名称为logrotate.conf。
2、语法
logrotate [-?dfv][-s <状态文件>][--usage][配置文件]
3、参数说明
-?或--help 在线帮助。 -d或--debug 详细显示指令执行过程,便于排错或了解程序执行的情况。 -f或--force 强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然。 -s<状态文件>或--state=<状态文件> 使用指定的状态文件。 -v或--version 显示指令执行过程。 -usage 显示指令基本用法。
4、实战
logrotate的配置文件是/etc/logrotate.conf,通常不需要对它进行修改。日志文件的轮循设置在独立的配置文件中,它(们)放在/etc/logrotate.d/目录下。
创建一个日志文件,然后在其中填入一个10MB的随机比特流数据文件:
touch /home/root/file.json
head -c 10M < /dev/urandom > /home/root/file.json
[root@xubuntu ~]# vim /etc/logrotate.d/usbrecord
/var/log/file.json {
monthly
rotate 5
compress
delaycompress
missingok
notifempty
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}
即使轮循条件没有满足,我们也可以通过使用‘-f’选项来强制logrotate轮循日志文件,‘-v’参数提供了详细的输出。
测试配置是否正确:lograte -d /etc/logrotate.d/usbrecord
强制运行配置文件:lograte -vf /etc/logrotate.d/usbrecord 记住不要添加-d参数 In debug mode, no changes will be made to the logs or to the logrotate state file.
logrotate配置参数
配置参数 | 功能说明 |
---|---|
compress | 通过gzip 压缩转储以后的日志 |
nocompress | 不需要压缩时,用这个参数 |
copytruncate | 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。 |
nocopytruncate | 备份日志文件但是不截断 |
create mode owner group | 转储文件,使用指定的文件模式创建新的日志文件。轮转时指定创建新文件的属性,如create 0777 nobody nobody |
nocreate | 不建立新的日志文件 |
delaycompress | 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩 |
nodelaycompress | 覆盖 delaycompress 选项,转储同时压缩 |
errors address | 专储时的错误信息发送到指定的Email 地址 |
ifempty | 即使是空文件也转储,这个是 logrotate 的缺省选项。 |
notifempty | 如果是空文件的话,不转储 |
mail address | 把转储的日志文件发送到指定的E-mail 地址 |
nomail | 转储时不发送日志文件 |
olddir directory | 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 |
noolddir | 转储后的日志文件和当前日志文件放在同一个目录下 |
prerotate/endscript | 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;这两个关键字必须单独成行; |
postrotate/endscript | 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行; |
daily | 指定转储周期为每天 |
weekly | 指定转储周期为每周 |
monthly | 指定转储周期为每月 |
rotate count | 指定日志文件删除之前转储的个数,0 指没有备份,5 指保留5个备份 |
tabootext [+] list 让logrotate | 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~ |
size | size当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem). |
missingok | 如果日志丢失,不报错继续滚动下一个日志 |
notifempty | 当日志文件为空时,不进行轮转 |
sharedscripts | 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本 |
dateext | 使用当期日期作为命名格式 |
dateformat .%s | 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数 |
size(或minsize) log-size | 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem). |
命令执行过程
root@ubuntu0006:/var/log/hankin/hj# logrotate -vf /etc/logrotate.d/usbrecord
reading config file /etc/logrotate.d/usbrecord
Handling 1 logs
rotating pattern: /var/log/hankin/hj/1.json forced from command line (2 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/hankin/hj/1.json
log needs rotating
rotating log /var/log/hankin/hj/1.json, log->rotateCount is 2
dateext suffix '-20210309'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/log/hankin/hj/1.json.2.gz to /var/log/hankin/hj/1.json.3.gz (rotatecount 2, logstart 1, i 2),
renaming /var/log/hankin/hj/1.json.1.gz to /var/log/hankin/hj/1.json.2.gz (rotatecount 2, logstart 1, i 1),
renaming /var/log/hankin/hj/1.json.0.gz to /var/log/hankin/hj/1.json.1.gz (rotatecount 2, logstart 1, i 0),
old log /var/log/hankin/hj/1.json.0.gz does not exist
renaming /var/log/hankin/hj/1.json to /var/log/hankin/hj/1.json.1
creating new /var/log/hankin/hj/1.json mode = 0644 uid = 0 gid = 0
compressing log with: /bin/gzip
removing old log /var/log/hankin/hj/1.json.3.gz
- 判断是否有notifempty参数,如果是空文件的话,不转储
- 先将文件夹中的压缩文件重命名,即将1、2变成2、3,0不存在所以不存在1了
- 对每个文件重命名加.1
- 创建空的原始文件
- gzip压缩.1文件为gz文件
- 判断rotete数量是多少,是否需要删除老的压缩文件
参数解读
dateext:默认以1累积命名,加了dateext后1.json.1.gz变成1.json-20210309.gz,只能保存一个文件,再压缩失败 compress:是否进行gzip压缩,一般配置 delaycompress:缺少gzip这一步,下一次生效,一般不配置
5、crontab命令
crontab -e可以直接进行编辑,和系统的不冲突。 生成的配置文件路径:/var/spool/cron/crontabs/root
logrotate的行为也是受crontab控制,在/etc/cron.daily目录下。 而crontab任务是受anacron控制,在/etc/anacron文件中配置(可能不存在这一层控制)
logrotate是基于crond服务来运行的,其crond服务的脚本是/etc/cron.daily/logrotate,日志转储是系统自动完成的。实际运行时,logrotate会调用主配置文件 /etc/logrotate.conf,可以在 /etc/logrotate.d 目录里放置自定义好的配置文件,用来覆盖logrotate的缺省值。定时执行/etc/cron.daily目录下的文件的设置,则在/etc/anacrontab里定义的,那anacrontab怎么知道上次成功执行脚本的具体时间呢?通过查看/etc/cron.daily/logrotate得知有 /var/lib/logrotate/logrotate.status这样的一个文件,此文件的作用就是记录最近一次成功运行日志分割脚本的具体时间.
所以logrotate执行脚本的命令其实是/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf。
https://blog.csdn.net/qq_36470898/article/details/105978773 https://www.runoob.com/w3cnote/linux-crontab-tasks.html
rsyslog服务和logrotate服务
rsyslog 是一个 syslogd 的多线程增强版。 现在Fedora和Ubuntu, rhel6默认的日志系统都是rsyslog了 rsyslog负责写入日志, logrotate负责备份和删除旧日志, 以及更新日志文件
6、如果logrotate 1并且是datetext能不能成功?
如果不限制格式(dateformat),默认是按照日期命名,如20210325。这样压缩会报错文件已存在。 如果加了格式限制,如dateformat -%Y-%m-%d-%s,按秒命名,文件名不会出现重复,就不会有文件存在错误。 delaycompress延迟压缩,当出现需要压缩的时候,只会把原先的文件重新命名,等到下一次触发压缩的时候再进行压缩。对于只转存一次的脚本来说不需要,也可以需要。 su这个还是很重要的,不然可能会出现报错:error: skipping "/var/log/hj.json" 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 root或者hourly都不是标准的,hourly没有这个配置,root root不需要填写。
/var/log/*.json {
su
missingok
rotate 1
compress
delaycompress
notifempty
noolddir
copytruncate
nomail
dateext
dateformat -%Y-%m-%d-%s
size 1M
}