Linux使用某些软件的时候会产生日志文件,而这些软件本身对日志不进行分割或者压缩处理,久而久之会导致日志文件异常巨大,影响机器性能,配置不高的VPS上尤为严重。而logrotate就是管理这些日志文件的神器,可以对单个日志文件或者某个目录下的文件按时间/大小进行切割,压缩操作;指定日志保存数量;还可以在切割之后运行自定义命令。
1、logrotate 分割日志原理
系统会按照计划的频率运行logrotate,通常是每天。在大多数的Linux发行版本上,计划每天运行的脚本位于 /etc/cron.daily/logrotate 。当然,也有一些系统的文件位置不同,比如Gentoo,这个脚本是 /etc/cron.daily/logrotate.cron。如果你想让logrotate运行频率更高(比如每小时运行一次),你只需要用一个脚本来让cron运行 /etc/cron.hourly/logrotate.cron 。当logrotate运行的时候,它会读取自身的配置文件来决定需要分割日志文件的路径,分割日志文件的频率及保留多少个日志存档。
下面是每天定时任务里面的日志分割脚本
[root@localhost /etc/cron.daily]#cat logrotate #!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0
2、logrotate.conf 主配置文件
logrotate的主要配置文件位于 /etc/logrotate.conf 。这个文件包含logrotate分割日志时所使用的默认的参数。这个文件一般是被注释掉的,所以你可以粗略浏览一下看看大概的设置。文件中的数个文件会在下文中提及。注意当中的一行:include /etc/logrotate.d。这个目录就是各软件使用logrotate分割日志文件所使用的配置文件
[root@localhost ~]#cat /etc/logrotate.conf # see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # use date as a suffix of the rotated file dateext # uncomment this if you want your log files compressed #compress # RPM packages drop log rotation information into this directory include /etc/logrotate.d # no packages own wtmp and btmp -- we'll rotate them here /var/log/wtmp { monthly create 0664 root utmp minsize 1M rotate 1 } /var/log/btmp { missingok monthly create 0600 root utmp rotate 1 } # system-specific logs may be also be configured here. [root@localhost /etc/logrotate.d]#ll #最好将每个软件的配置文件单独放在一个目录,不用的时候直接将这个文件删除就可以,很方便 total 52 -rw-rw-r--. 1 root root 135 Jan 18 2016 ConsoleKit -rw-r--r--. 1 root root 71 May 11 2016 cups -rw-r--r--. 1 root root 139 May 11 2016 dracut -rw-r--r--. 1 root root 185 Feb 4 2016 httpd
配置文件说明:这里定义的是全局的配置项,如果下面的配置文件里面没有设置相关的项目,继承全局配置,否则单独定义的配置生效
rotate 4:只保留最新的4个日志文件 create:当旧的日志文件滚动后,会自动创建一个新的空文件, dateext:滚动的日志文件以日期为后缀 #compress:不压缩日志文件
3、配置文件说明
下面是一个rpm包安装的nginx自带的配置文件,以这个作为说明
[root@localhost /etc/logrotate.d]#cat nginx /var/log/nginx/*log { daily rotate 10 missingok notifempty compress sharedscripts postrotate /bin/kill -USR1 $(cat /var/run/nginx.pid 2>/dev/null) 2>/dev/null || : endscript }
在 /etc/logrotate.d/ 目录下的应用配置文件继承所有的 /etc/logrotate.conf 默认参数
-
日志文件
通常情况下,一个或一组文件的分割操作是由之后的括号区块中的参数所决定。大多数应用的日志文件只有一个括号区块,但是可以指定多个区块,在一个配置文件里,甚至在主配置文件 /etc/logrotate.conf 里,你可以为一个括号区块指定多个文件,可以是带通配符的文件名或者单独列出的多个日志文件(用空格分开)。例如,要指定 /var/foo/ 目录下所有 .log 结尾的文件和 /var/bar/log.txt , 配置如下。要设置特定的结尾符号.log,和滚动的日志分开。不能只指定一个目录,比如:/var/log/nginx,因为滚动后的日志也在里面,下次执行的时候,滚动的日志也会再次滚动
/var/foo/*.log /var/bar/log.txt { rotate 14 daily compress delaycompress sharedscripts postrotate /usr/sbin/apachectl graceful > /dev/null Endscript }
-
创建新文件
create:当旧的日志文件滚动后,会自动创建一个新的空文件,新的日志文件具有和原来的文件一样的权限。
-
分割数量
rotate 命令指定分割日志的数量,也就是保留多少个日志,当新的分割日志产生时,会删除最老的一个。下面的命令就告诉logrotate每次最多保留4个已分割存档日志文件。如果已经有4个日志文件,再次进行分割操作的时候,最老的那个将会被删除例如:
rotate 4
-
分割频度
你可以用如下命令指定多久分割一次指定的日志文件,如果没有指定参数,那日志将会在logrotate运行时被运行(除非指定有其它参数,比如 size )可用的命令包括:
daily weekly monthly yearly
如果你希望用上述之外的参数来分割日志,需要要创建一个单独的文件,例如,如果你希望每小时分割一次指定的日志文件,你可以在 /etc/cron.hourly 目录下创建一个文件,当中包含类似下列的命令
/usr/sbin/logrotate /etc/logrotate.hourly.conf
然后你就按照一般的配置文件进行配置 /etc/logrotate.hourly.conf 即可
-
Size 文件大小
你可以用size命令指定一个大小,logrotate会检查文件大小来决定是否运行分割。你要指定一个大小的单位:三行分别是100K和100M。如果频度和大小命令同时存在,大小执行的优先级将高于频度。
size 100k size 100M
-
压缩
如果你希望对日志以gzip格式进行压缩(大多数情况下是的),你可以在配置文件里配置:compress
如果你不希望对日志文件进行压缩,那可以在应用配置文件里进行配置:nocompress
-
另外一个关于压缩的命令是:这个文件的作用是在下次logrotate进行分割操作时再将本次分割的日志文件进行压缩操作,请注意这个命令仅在有compress命令时起作用。
delaycompress
-
分割后 – postrotate
Logrotate每次分割文件后会运行 postrotate 后的命令。最通常的作用是让应用重启,以便切换到新的日志文件。
postrotate /usr/sbin/apachectl restart > /dev/null endscript
>/dev/null 让logrotate进行将脚本命令执行时的输出内容不保存。如果应用正常启动,你不会看到任何输出内容。postrotate 告知logrotate要运行的脚本,注意命令要换行, endscript 则是脚本命令的结束提示。
-
分享脚本 – Sharedscripts
logrotate每分割一个日志文件就会运行一次 postrotate 里的脚本命令。如果括号区块前有有多个文件,就会运行多次。例如,如果Nginx的access日志和error日志都被分割,那 postrotate 里的脚本就会被运行两次,如果脚本命令里是重启服务器,那服务器就会被重启两次,这显然不是我们所希望的。这个时候我们就需要让logrotate在分割多个文件的时候只运行一次 postrotate 里脚本命令:
sharedscripts
这个命令的作用就是在运行 postrotate 里的脚本命令之前检查是否还有日志文件要分割,所有需要日志文件都分割完之后才会运行脚本命令。当然,如果没有日志文件需要分割, postrotate 里的脚本命令同样不会运行。
-
missingok
如果日志文件丢失,请转到下一个文件,而不会发出错误信息。 另见nomissingok。
-
notifempty 如果是空文件的话,不转储
–
–
–
评论前必须登录!
注册