路漫漫其修远兮
吾将上下而求索

linux日志滚动:logrotate命令

        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 如果是空文件的话,不转储

未经允许不得转载:江哥架构师笔记 » linux日志滚动:logrotate命令

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址