因部分日志需要根据日志保留规范保留指定时间日志信息,例如主机日志留存时间不得少于6个月。
在某些场景下,日志没有自动切分的情况,日志文件会越来越大,查看很不方便,在合理的时间里进行日志切割也非常有必要。本文主要介绍利用logrorate
进行日志切割和日志备份。以主机日志和Nginx
日志为例说明具体使用方法和注意事项。
logrotate
程序是一个日志文件管理工具。它提供自动替换,压缩,删除和邮寄记录文件,每个记录文件都可被设置成每日,每周或每月处理,也能在文件太大时立即处理。使用者必须自行编辑,指定配置文件,预设的配置文件存放在/etc
目录下,文件名称为logrotate.conf
logrotate [-?dfv][-s <状态文件>][--usage][配置文件]
️参数说明:
-?
或--help
在线帮助。-d
或--debug
详细显示指令执行过程,便于排错或了解程序执行的情况。-f
或--force
强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然。-s
<状态文件>或--state=
<状态文件> 使用指定的状态文件。-v
或--version
显示指令执行过程。-usage
显示指令基本用法。
示例:
# 强制执行,会真正执行
/usr/sbin/logrotate -f /etc/logrotate.d/nginx
# 调试执行,不会真生成文件,会打印执行过程
/usr/sbin/logrotate -df /etc/logrotate.d/nginx
# 手动运行
logrotate /etc/logrotate.conf
配置文件格式:
日志文件路径 {
# 具体配置
}
# 示例
/usr/local/nginx/logs/*.log {
copytruncate
daily
rotate 180
dateext
missingok
compress
delaycompress
}
尽管花括号的开头可以和其他文本放在同一行上,但是结尾的花括号必须单独成行。
配置参数 | 说明 |
---|---|
monthly | 日志文件将按月轮循。其它可用值为daily ,weekly 或者yearly 。 |
rotate 5 | 一次将存储5个归档日志。对于第六个归档,时间最久的归档将被删除。 |
compress | 在轮循任务完成后,已轮循的归档将使用gzip 进行压缩。 |
delaycompress | 总是与compress 选项一起用,delaycompress 选项指示logrotate 不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。 |
nodelaycompress | 覆盖 delaycompress 选项,转储同时压缩。 |
missingok | 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。 |
notifempty | 如果日志文件为空,轮循不会进行。 |
ifempty | 默认值,即使是空文件也转储,这个是 logrotate 的缺省选项。【可以设置为该值】 |
create 644 root root | 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。 |
postrotate/endscript | 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。 |
copytruncate | 把原始文件拷贝一份,然后重命名,然后把原始文件清空。用于还在打开中的日志文件,把当前日志备份并截断 |
nocopytruncate | 备份日志文件但是不截断,新输入的日志文件在备份的文件中 |
dateext | 使用日期作为日志轮替文件的后缀 |
create mode owner group | 转储文件,使用指定的文件模式创建新的日志文件,默认只有create没有细化到具体权限 |
nocreate | 不建立新的日志文件 |
errors address | 专储时的错误信息发送到指定的Email 地址 |
mail address | 把转储的日志文件发送到指定的E-mail 地址 |
nomail | 转储时不发送日志文件 |
olddir directory | 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 |
noolddir | 转储后的日志文件和当前日志文件放在同一个目录下 |
sharedscripts | 对每个转储日志运行prerotate和postrotate脚本,日志文件的绝对路径作为第一个参数传递给脚本。 这意味着单个脚本可以针对与多个文件匹配的日志文件条目多次运行(例如/var/log/news/*.example )。 如果指定此项sharedscripts,则无论有多少个日志与通配符模式匹配,脚本都只会运行一次 |
nosharedscripts | 针对每一个转储的日志文件,都执行一次prerotate 和 postrotate脚本,此为默认值 |
prerotate/endscript | 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行 |
postrotate/endscript | 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行 |
tabootext [+] list | 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~ |
size Size | 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem). |
Linux
系统默认安装logrotate
工具。它默认的配置文件在:
/etc/logrotate.conf
/etc/logrotate.d/
logrotate.conf
是主要的配置文件,logrotate.d
是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf
中执行。
如果/etc/logrotate.d/
里面的文件中没有设置某些值,则会以/etc/logrotate.conf
这个文件的设定的值作为默认值;如果/etc/logrotate.d/
中的文件设置了,那么文件的优先级高。
Logrotate
是基于CRON
来运行的,其脚本是/etc/cron.daily/logrotate
,日志轮转是系统自动完成的,每天执行一次。
/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
# 以时间格式为后缀命名 access.log-yyyyMMdd
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.
/etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
注意:
logrorate
脚本默认在/etc/cron.daily
路径下,默认每天执行一次,具体执行时间说法不一,实际观察执行时间在凌晨3点左右,如果这个时间不满足实际需求,可执行编写cron
即可
linux
系统中/var/log/
目录日志默认保存四周并不生成系统日志(syslog.log),当用户有规定保存多少天时才去进行修改。系统日志路径/var/log/
目录下
logrotate
是一个日志管理程序,用来把旧的日志文件删除(备份),并创建新的日志文件,这个过程称为“转储”。
调整/etc/logrotate.conf
中的weekly
为指定时间即可。例如半年,将默认的4改为26即可
# keep 4 weeks worth of backlogs
rotate 26
因为/etc/logrotate.d/syslog
中做了详细的配置,我们只需要指定时间即可。
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
missingok
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
在/etc/logrorate.d/
目录下添加nginxlog配置
# 添加nginxlog配置文件,文件名自定义即可
vim /etc/logrorate.d/nginxlog
# 加入以下配置【推荐】
/usr/local/nginx/logs/*.log {
daily
rotate 180
dateext
missingok
compress
delaycompress
postrotate
if [ -f /usr/local/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid 2> /dev/null` 2> /dev/null || true
fi
endscript
}
# 不推荐配置
/usr/local/nginx/logs/*.log { # 日志路径
copytruncate # 以复制的方式备份文件,会截断正在输入的内容,但是会在备份时产生两倍的空间,磁盘空间小的情况下不建议使用。
daily # 按天执行
rotate 180 # 保留180个
dateext # 以时间格式为后缀
missingok # 文件缺失不报错
compress # 打包
delaycompress # 延迟打包
}
# 推荐配置
/usr/local/nginx/logs/*.log { # 日志路径
daily # 按天执行
rotate 180 # 保留180个
dateext # 以时间格式为后缀
missingok # 文件缺失不报错
compress # 打包
delaycompress # 延迟打包
postrotate # 后执行脚本,nginx.pid根据真实路径写
if [ -f /usr/local/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid 2> /dev/null` 2> /dev/null || true # 刷新日志配置文件
fi
endscript
}
对于第一种不推荐的配置:如果不添加
copytruncate
,那么日志不会被截断,还是会输入到新的已经备份的文件中。加了copytruncate
,会有复制动作,备份时会占用很大磁盘空间。
第二种配置使用了后置脚本,重新刷新了日志文件,也不会出现第一种占用空间的情况。
# 调试执行,不会真生成文件,会打印执行过程
/usr/sbin/logrotate -df /etc/logrotate.d/nginx
kill -USR1:
通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。
kill -HUP pid 或者 killall -HUP pName:
其中pid是进程标识,pName
是进程的名称
如果想要更改配置而不需停止并重新启动服务,可以使用上面两个命令。在对配置文件作必要的更改后,发出该命令以动态更新服务配置。
根据约定,当你发送一个挂起信号(信号1或HUP)时,大多数服务器进程(所有常用的进程)都会进行复位操作并重新加载它们的配置文件。
- Linux logrotate命令 | 菜鸟教程
- Tomcat日志catalina.out过大问题_绿毛水怪ttb的博客-CSDN博客_tomcat的catalina太大
- logrotate 的使用简介_冻梨不是梨的博客-CSDN博客_logrotate
- Linux 日志切割神器 Logrotate 原理和配置详解_Biu_diudiu的博客-CSDN博客
- 日志切割之Logrotate - 惨绿少年 - 博客园