0%

Linux日志文件管理logrotate

主流Linux发行版上都默认安装有logrotate包

在Debian或Ubuntu上:

1
# apt-get install logrotate cron 

在Fedora,CentOS或RHEL上:

1
# yum install logrotate crontabs 

logrotate的配置文件是/etc/logrotate.conf,通常不需要对它进行修改。日志文件的轮循设置在独立的配置文件中,放在/etc/logrotate.d/目录下。

使用

配置说明

  • monthly: 日志文件将按月轮循。其它可用值为‘daily’,‘weekly’或者‘yearly’。
  • rotate 5: 一次将存储5个归档日志。对于第六个归档,时间最久的归档将被删除。
  • compress: 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。
  • nocompress: 不压缩
  • copytruncate: 用于还在打开中的日志文件,把当前日志备份并截断
  • nocopytruncate: 备份日志文件但是不截断
  • delaycompress: 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。
  • nodelaycompress: 覆盖 delaycompress 选项,转储同时压缩。
  • mail address: 把转储的日志文件发送到指定的E-mail 地址
  • nomail: 转储时不发送日志文件
  • olddir directory: 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
  • noolddir: 转储后的日志文件和当前日志文件放在同一个目录下
  • missingok: 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
  • notifempty: 如果日志文件为空,轮循不会进行。
  • create 644 root root: 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。
  • nocreate: 不建立新的日志文件
  • postrotate/endscript: 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。
  • tabooext [+] list: 让logrotate不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
  • size size: 当日志文件到达指定的大小时才转储,bytes(缺省)及KB(sizek)或MB(sizem)
  • missingok: 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。

样例一

创建一个日志文件,然后在其中填入一个10MB的随机比特流数据。

1
2
# touch /var/log/log-file
# head -c 10M < /dev/urandom > /var/log/log-file

基本使用

1
2
3
4
5
6
7
8
9
10
11
12
/var/log/log-file {
monthly
rotate 5
compress
delaycompress
missingok
notifempty
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}

样例二

轮循一个日志文件

1
2
3
4
5
6
7
8
/var/log/log-file {
size=50M
rotate 5
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}

样例三

轮循一个nginx日志文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/usr/local/nginx/logs/*.log {
su root root
daily
notifempty
missingok
compress
delaycompress
rotate 7
dateext
sharedscripts
postrotate
[ -f /usr/local/nginx/logs/nginx.pid ] && kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
endscript
}

样例四

让旧日志文件以创建日期命名

1
2
3
4
5
6
7
8
9
/var/log/log-file {
monthly
rotate 5
dateext
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}

排障

手动运行logrotate

要调用为/etc/lograte.d/下配置的所有日志调用logrotate

1
# logrotate /etc/logrotate.conf 

要为某个特定的配置调用logrotate:

1
# logrotate /etc/logrotate.d/log-file 

排障过程中的最佳选择是使用‘-d’选项以预演方式运行logrotate。要进行验证,不用实际轮循任何日志文件,可以模拟演练日志轮循并显示其输出。

1
# logrotate -d /etc/logrotate.d/log-file 

Logrotate的记录日志

logrotate自身的日志通常存放于/var/lib/logrotate/status目录。如果处于排障目的,我们想要logrotate记录到任何指定的文件,我们可以指定像下面这样从命令行指定。

1
# logrotate -vf –s /var/log/logrotate-status /etc/logrotate.d/log-file

Logrotate定时任务

logrotate需要的cron任务应该在安装时就自动创建了,我把cron文件的内容贴出来,以供大家参考。

1
# cat /etc/cron.daily/logrotate 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh

# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
[ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf