logrotate学习使用

空格Ctrl
转载请注明原创出处,谢谢!

起因

一个项目一般由多个组件协作实现,各组件会生成不同的日志。为控制日志,组件一般对自己产生的日志会有一定的设置,这些日志配置通常是写死的,常见控制日志信息的工具有Log4J和SLF4J。因为磁盘容量有限,在多个组件共同作用下,可能会出现日志未到规定时间删除,而磁盘大小被日志撑满,不能再写入的情况。

logrotate简介

logrorare一定程度上可以简化对会生成大量日志文件的系统的管理。logrotate可以实现自动轮替、删除、压缩和mail日志的功能。

执行命令
logrotate [-dv] [-f|--force] [-s|--state statefile] config_file ..
选项
# logrotate --help
Usage: logrotate [OPTION...] 
  -d, --debug              Don't do anything, just test (implies -v) 不做实际处理,仅调试
  -f, --force              Force file rotation 强制执行,忽视参数要求
  -m, --mail=command        Command to send mail (instead of `/bin/mail') 发送mail
  -s, --state=statefile    Path of state file 查看状态文件
  -v, --verbose            Display messages during rotation 轮替一次,并显示轮替过程信息
  --version                Display version information 显示logrotate版本

Help options:
  -?, --help                Show this help message
  --usage                  Display brief usage message
配置文件
/etc/logrotate.conf
/etc/logrotate.d

logrotate.conf是主要的参数文件,至于logrotate.d是一个目录,该目录里面的所有文件都会被logrotate.conf文件主动读入,若logrotate.d/里的文件没有指定详细设置,则以/etc/logrotate.conf这个文件里配置的默认值为准。

/etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly 每周轮替一次
weekly

# keep 4 weeks worth of backlogs 保留4个轮替日志
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 让/etc/logrotate.d目录下面配置文件内容参与轮替
include /etc/logrotate.d

# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {   #轮替对象为/var/log/中的wtmp文件
    monthly       #每个月轮替一次
    create 0664 root utmp #创建新的日志文件 权限 所属用户 所属组
    minsize 1M    #日志大小大于1M后才能参与轮替
    rotate 1      #保留一个轮替日志文件
}

/var/log/btmp {
    missingok   #如果日志文件不存在,继续进行下一个操作,不报错
    monthly
    create 0600 root utmp
    rotate 1
}

/etc/logrotate.d

/etc/logrotate.d如上面说到的,在logrotate配置中扮演一个目录的角色,通过logrotate.conf中的配置include /etc/logrotate.d/etc/logrotate.d目录包含进来,即将该目录下的文件内容加入到轮替任务中。

这里先简单介绍一下该目录下的文件内容及其格式,后面再对具体案例进行分析。

格式
日志文件路径 ...{ #多个文件绝对路径路径可以用空格、换行分隔,
  参数配置
}
/etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler      #作用域:/var/log/目录下的cron、maillog、messages、secure和spooler文件
{
    missingok         
    sharedscripts     #作用域下文件存在至少有一个满足轮替条件的时候,完成轮替后执行一次postrotate内的脚本。
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
常用参数
参数 描述
daily 每天轮替一次
weekly 每周轮替一次
monthly 每月轮替一次
yearly 每年轮替一次
rotate 保留几个轮替日志文件
ifempty 不论日志是否空,都进行轮替
notifempty 若日志为空,则不进行轮替
create 旧日志文件轮替后创建新的日志文件
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断
size 日志达到多少后进行rotate
minsize 文件容量一定要超过多少后才进行rotate
nocompress 轮替但不进行压缩
compress 压缩轮替文件
dateext 轮替旧日志文件时,文件名添加-%Y %m %d形式日期,可用dateformat选项扩展配置。
nodateext 旧日志文件不使用dateext扩展名,后面序数自增如"*.log.1"
dateformat 只允许%Y %m %d和%s指定符。注意:系统时钟需要设置到2001-09-09之后,%s才可以正确工作
sharedscripts 作用域下文件存在至少有一个满足轮替条件的时候,执行一次prerotate脚本和postrotate脚本。
prerotate/endscript 在轮替之前执行之间的命令,prerotate与endscript成对出现。
postrotate/endscript 在轮替之后执行之间的命令,postrotate与endscript成对出现。
olddir 将轮替的文件移至指定目录下
missingok 如果日志文件不存在,继续进行下一个操作,不报错
举个自定义的例子
#/etc/logrotate.d/test
/test/log/*.log{
    daily
    rotate 2
    size 1M
    create
    compress
    missingok
    dateext
    olddir /test/rotate
}

每天/test/log/目录下后缀为“.log”的且大小超过1MB的文件进行轮替,文件后缀为”-20171124“。压缩轮替后的文件,并将该文件移到”/test/rotate“目录下,一个原日志文件最多仅有2个对应轮替日志文件,若轮替日志大于设定的值则删除之前较早的轮替日志文件。创建新的日志文件。若/test/log/目录下文件名以”.log“结尾的文件不存在,不报错

回到之前的话题,磁盘被日志撑满的话题,参考参数列表,我们会发现logrotate提供的轮替周期参数只能精确到天,以一天为轮替周期在一些情况下并不能满足我们的要求,这个时候该怎么办呢?

----这里可以搭配crontab(例行性工作),通过定时任务来执行logrotate命令,从而在不同情况实现对logrotate任务的自定义频率调用。

例行性工作的简单配置使用

cron执行时会读取/etc/cron.d这个目录的所有文件,按照文件中的设置来定时执行任务。该目录下新增的文件后,无需再重启crond服务。这里只简单地介绍该种定时任务配置。

# 格式
*(分钟) *(小时) *(天) *(月) *(周几) 用户 命令
# 若分钟位值为 *,表示0-59之间的任意有效值;
# 若分钟位值为 1,表示每小时的第1分钟;
# 若分钟位值为 */5,表示每5分钟
# 若分钟位值为10,20 表示每小时的第10分钟和第20分钟
# 若分钟位值为10-12 表示每小时的第10、11、12分钟
# /etc/cron.d/cron_test
* */1 * * * root /usr/sbin/logrotate -v /etc/logrotate.d/test

每小时root用户会调用logrotate读取/etc/logrotate.d/test配置,执行一次。

友情提示:在实际应用场景中,我们还需要考虑进程是否支持重新打开日志文件,这里对参数create和copytruncate作一个补充说明。

首先,create和copytruncate为互斥的参数配置。
create的实现思路是将原日志文件进行重命名,再以原日志文件名创建新日志文件。不过需要注意的是,如果当前进程不支持重新打开日志文件,新生成的日志会出现无法正常写入到新日志文件的情况,这里就需要重启进程达到重新打开日志文件的目的。
为了解决当前进程不支持重新打开日志文件的场景,我们这里可以通过配置参数copytruncate代替create。
copytruncate的实现思路是将原日志文件中的内容拷贝到新日志文件中,然后对原日志文件内容进行清空操作,因为不存在重新打开日志文件的需求。不过使用copytruncate也存在一定的风险,即由于拷贝和清空是两个操作步骤,操作存在时间间隔,因为从拷贝完成到清空文件之间生成的日志信息会丢失。

若存在理解有误的地方,望建议与指正,谢谢。

你可能感兴趣的:(logrotate学习使用)