logrotate日志切割详解
介绍
logrotate是一个linux系统日志的管理工具。可以对单个日志文件或者某个目录下的文件按时间/大小进行切割,压缩操作;指定日志保存数量;还可以在切割之后运行自定义命令。
logrotate是基于crontab运行的,所以这个时间点是由crontab控制的,具体可以查询crontab的配置文件/etc/anacrontab。系统会按照计划的频率运行logrotate,通常是每天。在大多数的Linux发行版本上,计划每天运行的脚本位于 /etc/cron.daily/logrotate。
如果想更灵活的时间切割,可配合cron定时任务执行,这时就不要把切割脚本放在/etc/logrotate.conf下了,避免自己设置的定时任务和默认每天执行的定时任务重合。
logrotate.conf 是 logrotate 的主配置文件,logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行,另外,如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节,则会以/etc/logrotate.conf这个文件的设定来作为默认值。
设置日志切割示例
日志每天切割
cat nginx_access
/data/wwwlogs/clubmed2488.clubmedmnp.com_nginx.log {
su root root
daily
missingok
rotate 32
compress
delaycompress
dateext
copytruncate
}
# su root root: 指定 logrotate 在执行轮转操作时使用的用户和组
# daily: 指定日志文件每天轮转一次。
# missingok: 如果指定的日志文件不存在,logrotate 不会报错并继续执行其他任务
# rotate 32: 指定保留的旧日志文件数量。
# compress: 轮转后的日志文件将被压缩,通常使用 gzip 压缩。
# delaycompress: 延迟压缩。这意味着当前的日志文件在下一次轮转时才会被压缩
# dateext: 使用日期作为扩展名来命名轮转后的日志文件
# copytruncate: 先复制当前的日志文件,然后清空原日志文件。这种方法可以确保应用程序在日志文件被轮转后仍然可以继续写入日志,而不会丢失任何数据。
日志大小切割
vim /etc/logrotate.d/catalinacut #配置个新的logrotate文件名字叫catalinacut
/opt/tomcat/apache-tomcat-9.0.96/logs/catalina.out {
rotate 10
missingok
dateext
size 10G
copytruncate
}
# rotate 10: 保留最近10个切割后的日志文件
# missingok: 如果日志文件丢失,不报错
# dateext: 切割后的日志文件以日期为后缀
# size 10G: 当日志文件大小超过10G时切割
# copytruncate: 拷贝并截断原日志文件(适用于仍在写入的日志文件)
常用参数
-d:测试执行,不是真的执行
-f:强制切割
logrotate所有参数释义
# 压缩
compress:使用压缩,默认的压缩方式为 gzip
compresscmd:自定义压缩的命令,默认压缩方式为 gzip
uncompresscmd:自定义解压的命令,默认解压工具为 gunzip
compressext:压缩时使用后缀,默认 gzip 压缩格式下后缀为 .gz
compressoptions:压缩选项,默认使用 gzip;如果使用其他压缩选项,需要设置 compressoptions 与之匹配
delaycompress:延迟压缩,实际压缩生效的时间发生在下一次日志切割之时
nodelaycompress:不使用延迟压缩,即轮转时压缩(默认配置)
nocompress:不实用压缩
# 归档方式
copy:轮转时复制完整的日志文件,常用来做当前日志文件的镜像备份。当指定 copy 选项时, create 选项会失效
copytruncate:轮转时复制完整的日志文件并清空原来的日志文件(相当于 echo > logfile),新写入的日志会继续往清空后的日志文件中写入。但在日志 copy和 truncate 的过程中写入的日志可能会丢失。当指定 copytruncate 选项时,create 选项会失效
nocopy:轮转时不会复制原日志文件
nocopytruncate:轮转时复制原日志文件后不会清空原日志文件的内容
create:轮转时创建一个新的日志文件,可以设置创建文件的权限、所有者、及属组
nocreate:轮转时不会创建新的日志文件
createolddir:轮转时如果指定的目录不存在,则会创建,支持设置目录的权限、所有者和属组
nocreateolddir:轮转时指定的目录不存在时不会进行创建
# 归档路径
olddir directory:配置目录后,轮转后的日志会保存在指定的目录下
noolddir:轮转后的日志保存在日志原有的目录下
# 归档删除
shred:删除日志时使用 shred -u(粉碎式删除) 的方式(默认关闭)
shredcycles count:删除日志前会先重写覆盖日志文件,达到设定的次数后才进行删除
noshred:删除日志时使用 unlink 的方式删除(还没搞懂这个删除逻辑)
# 归档规则
hourly:每小时进行一次日志切割
daily:每天进行一次日志切割
weekly:每周进行一次日志切割
monthly:每月进行一次日志切割
yealy:每年进行一次日志切割
size:按日志大小进行切割
rotate count:日志轮转时保存的归档文件数量
start count:日志轮转时从指定的count开始,例如,start 9,则日志轮转后会跳过 0-8 生成 xxx.9 这样的日志,
maxage count:轮转后的日志超过设定的日期会被删除,只有被轮转的日志才会应用到此规则
maxsize size:设置maxsize后,如果被轮转的日志大小超过设置的 size,则会在设置的轮转时间(例如:weekly)之前进行日志轮转
minsize size:设置minsize后,如果被轮转的日志大小不满足设置的size,即便到了设置的轮转时间也不会触发日志轮转
# 日期格式
dateext:切割后日志的后缀名以 "YYYYMMDD" 为格式
nodateext:轮转日志时不使用后缀名为日期的格式
dateformat:自定义日志后缀的时间格式,仅 %Y %m %d %H %s 可以被使用。 例如 dateformat %m/%d/%Y
dateyesterday:切割日志时使用昨天的时间而不是今天的时间
extension:日志文件在轮转后使用指定的 ext 扩展名。如果使用压缩,通常ext还会加上压缩文件的扩展名,通常是 .gz。例如,你有一个日志文件名为 mylog.foo,你可以通过 extension ext 将日志轮转为 mylog.1.foo.gz 而不是 mylog.foo.1.gz
# 轮转规则
ifempty:日志为空时也会按照规则进行轮转
notifempty:日志为空时不进行轮转
missingok:轮转的日志不存在时,继续下一个日志的轮转,不会报错
nomissingok:轮式时日志不存在,会有报错提示 (默认配置)
# 邮件配置
mail address:配置邮件地址后,会将轮转的日志信息发送到邮箱
nomail:不发送轮转的日志信息到任何邮箱 (默认配置)
mailfirst:配置邮箱后,轮转后将本次生成的日志文件发送到邮箱
maillast:配置邮箱后,将上一次轮转的日志文件发送到邮箱 (默认配置)
# 归档时执行的脚本
include file_or_directory:轮转前会尝试读取 include 配置的文件或目录,如果配置的是目录,则目录下的所有文件都会被加载到轮转的配置中;但对于文件扩展名以 taboo 结尾的文件或配置路径为多个目录、管道等时,加载配置时会被忽略
prerotate/endscript:日志轮转前会执行自定义的命令(脚本)。通常,轮转的日志的完整路径会作为传入的第一个参数
postrotate/endscript:日志轮转后会执行自定义的命令(脚本)。通常,轮转的日志的完整路径会作为传入的第一个参数
firstaction/endscript:执行 prerotate/endscript 前且最少一个日志会被轮转时执行该语句,整个模式会作为第一个参数传递给该语句,当语句执行异常时,不会再向下执行
lastaction/endscript:执行 postrotate/endscript 前且最少一个已经被轮转后执行该语句,整个模式会作为第一个参数传递给该语句,当语句执行异常时,仅仅展示错误信息
preremove/endscript:仅仅当删除轮转过的日志前执行该语句。即将被删除的日志名会作为参数被传递进该语句
sharedscripts:共享模式。启用共享模式后,当 prerotate 和 postrotate 语句执行时匹配到多个日志时,prerotate 和 postrotate 语句仅仅只会执行一次。正常模式下,轮转时匹配到的每个日志文件都会单独执行一次 prerotate 和 postrotate 语句。
nosharedscripts:轮转时匹配到多个日志文件时,每个日志文件都会执行一次 prerotate 和 postrotate 语句。(默认配置)