1、logrotate 配置说明
logrotate
是 Linux 系统自带的一个日志管理工具,通过读取定义的配置文件来对指定的日志进行管理,防止日志文件过大而导致存储空间满载。
logrotate 配置文件:
-
主配置文件:
/etc/logrotate.conf
-
子配置文件:
/etc/logrotate.d/
子配置文件命名方式:
logrotate
子配置文件在/etc/logrotate.d/
目录中定义,配置文件可以任意命名,但是一般以服务名或应用名命名,这样方便识别。
例如:管理MySQL日志时,MySQL配置文件命名方式:
/etc/logrotate.d/mysql-server
日志文件默认命名规则:
日志轮换就是将当前的日志文件重命名为带编号的历史文件(如 .1
、.2
),然后重新创建一个新的空日志文件,供服务继续写入。
例如:对/var/log/syslog进行轮换时
- 第一次轮换:syslog → syslog.1,syslog会被重新创建
- 第二次轮换:syslog.1 → syslog.2,syslog → syslog.1,syslog会被重新创建
- 第三次轮换:syslog.2 → syslog.3,syslog.1 → syslog.2,syslog → syslog.1,syslog会被重新创建
2、logrotate 规则指令
轮转时间:
daily
: 表示日志文件每天都会被检查一次,如果其他要求也满足了,就会执行轮换操作。weekly
: 表示日志文件每周都会被检查一次,如果其他要求也满足了,就会执行轮换操作。monthly
: 表示每月检查一次日志文件,如果其他要求也满足了,就会执行轮换操作。yearly
: 表示每年检查一次日志文件,如果其他要求也满足了,就会执行轮换操作。
文件大小:
size
:指定日志文件的大小限制,如果日志文件超过了指定的大小,并且其他规则也满足了,就会执行轮换操作。
处理方式:
-
rotate N
:指定保留的历史日志文件数量。超过 N 个的旧日志文件将被删除。 -
compress
:启用日志文件压缩。轮换后的日志文件将使用 gzip 压缩。 -
delaycompress
:推迟压缩,直到下次轮换时再压缩当前日志。只有在文件第二次轮换时才会被压缩。 -
missingok
:指定的日志文件路径不存在,logrotate
不会因为找不到文件而报错,会跳过当前日志文件并继续处理其它日志。 -
notifempty
:日志文件 大小为 0 字节时,logrotate 会跳过这个文件,不进行轮换。 -
create mode owner group
:指定轮换后新创建的日志文件的权限、所有者和用户组。 -
dateext
:使用日期扩展名(如 .log-2023-01-01)来命名轮换后的日志文件。 -
olddir
:指定旧日志文件存放的目录。如果未指定,默认会保留在原目录。
全局指令:
以下指令只能做为全局指令。
su
:指定轮转日志时使用哪个用户和用户组的权限,一般要和日志文件所在目录文件的所有者和所有组一致。include
:子配置文件的存放路径。
例如:
su root adm
include /etc/logrotate.d
3、logrotate 配置格式
logrotate 配置文件一般是由两部分组成:
- 全局配置指令:出现在配置文件的最上面,设置默认行为,对 后续所有配置块生效
- 单个配置块:控制 特定日志文件的轮转行为,优先级高于全局设置,可以覆盖全局指令
配置文件格式:
# 全局配置指令
一个或多个日志文件路径
{
# 一个或多个轮转指令
# prerotate 和 endscript部分可以省略。是满足日志轮转要求后,会在进行日轮转前执行prerotate 和 endscrip中的语句
prerotate
# 标准的 shell 脚本语法,默认是 /bin/sh
endscript
# postrotate 和 endscript部分可以省略。是满足日志轮转要求后,会在进行日轮转后执行 postrotate 和 endscrip中的语句
postrotate
# 标准的 shell 脚本语法,默认是 /bin/sh
endscript
}
说明:
-
指定多个日志文件路径时,需要使用空格分隔。
-
指定多个日志文件路径时,支持使用通配符
*
进行多个日志文件匹配。
例如:对taos的日志进行管理
/var/log/taos/*.log {
missingok
compress
rotate 3
}
例如:配置对系统常见日志的管理规则
su root adm
/var/log/syslog
{
rotate 7 # 保留七个切割后的日志
daily # 每天检查一次/var/log/syslog是否满足其他指令指定的轮换要求
missingok # /var/log/syslog文件路径不存在
notifempty # /var/log/syslog文件大小为 0 字节时,不轮换
delaycompress # 直到下次轮换时再压缩当前日志
compress # 轮换后的日志文件将使用 gzip 压缩
# 如果满足日志切割要求,再进行切割前,执行以下操作
prerotate
if [ -f /var/log/syslog ]; then
size=$(stat -c %s /var/log/syslog)
if [ "$size" -ge $((5 * 1024 * 1024 * 1024)) ]; then
echo "" > /var/log/syslog
echo "Syslog exceeded 1G and was truncated at $(date)" >> /var/log/syslog
fi
fi
endscript
# 日志切割完成后,执行以下操作,防止切割后的日志过大
postrotate
find /var/log -name "syslog.*" -type f -size +600M -exec rm -f {} \;
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
例如:定义MySQL日志管理规则
/var/log/mysql.log
/var/log/mysql/*log
{
daily
rotate 7
missingok
create 640 mysql adm
compress
sharedscripts
postrotate
test -x /usr/bin/mysqladmin || exit 0
# If this fails, check debian.conf!
MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
if [ -z "`$MYADMIN ping 2>/dev/null`" ]; then
# Really no mysqld or rather a missing debian-sys-maint user?
# If this occurs and is not a error please report a bug.
#if ps cax | grep -q mysqld; then
if killall -q -s0 -umysql mysqld; then
exit 1
fi
else
$MYADMIN flush-logs
fi
endscript
}
例如:apache日志管理策略
/var/log/apache2/*.log {
daily # 每天检查一次/var/log/apache2/下以log结尾的文件
missingok # 如果/var/log/apache2/下以log结尾的文件不存在,就跳过
rotate 14 # 保留十四个转存后的日志文件
compress # 转存后的日志文件使用gzip压缩
delaycompress # 在第二次转存时才压缩第第一次转存的日志文件
notifempty # 如果/var/log/apache2/下以log结尾的文件大小为0,就不进行处理
create 640 root adm # 转存日志文件就是将现有满足条件的,以log结尾的文件使用gzip打包,
sharedscripts # 在轮换多个日志文件时,脚本(如 postrotate)只执行一次
prerotate # 在将满足条件的日志文件打包后,创建新的同名文件前执行的命令
if [ -d /etc/logrotate.d/httpd-prerotate ]; then
run-parts /etc/logrotate.d/httpd-prerotate
fi
endscript
postrotate # 在将满足条件的日志文件打包后,创建新的同名文件后执行的命令
if pgrep -f ^/usr/sbin/apache2 > /dev/null; then
invoke-rc.d apache2 reload 2>&1 | logger -t apache2.logrotate
fi
endscript
}
4、logrotate 执行周期
默认周期:每天 0 - 12
点读取一次配置文件中的规则,然后根据规则管理日志文件。
修改周期:
以 systemd
做为 init 初始化进行的操作系统中,是通过 systemd timer 来进行管理的。可以通过对应的 logrotate.timer
文件从而实现对执行周期的更改。logrotate.timer 默认会调用同名的 logrotate.service 服务
例如:ubuntu 2004 中的 logrotate.timer
# /lib/systemd/system/logrotate.timer
[Unit]
Description=Daily rotation of log files
Documentation=man:logrotate(8) man:logrotate.conf(5)
[Timer]
# 每天触发一次
OnCalendar=daily
# 不要求精确触发时间,允许偏差在 12 小时内,可能在 0~12 点之间的任意时刻执行(负载低的时间)
AccuracySec=12h
# 系统在预定时间没开机(比如昨天关机),那么 下次开机时自动补跑一次任务
Persistent=true
[Install]
WantedBy=timers.target
5、logrotate 常用选项
-
-f
:用于手动触发日志轮换,需要指定配置文件。 -
-d
:以调试模式运行,不执行实际的轮换操作。logrotate
会显示它将如何处理每个日志文件,但不会实际轮换或修改任何文件。 -
-s
:指定logrotate
保存其状态的文件路径,记录哪些日志文件已经轮换。 -
-v
:logrotate
在执行时会输出更多信息,显示每个日志文件的处理过程。 -
-l
:指定logrotate
运行时的日志文件路径,用于记录logrotate
的执行日志。
例如:手动轮换rsyslog日志
logrotate -f /etc/logrotate.d/rsyslog
说明:如果子配置文件中,没有通过全局指令su指定轮转日志时使用哪个用户和用户组的权限,会提示
error: skipping "/var/log/..." because parent directory has insecure permissions (It's world writable or writable by group which is not "root")
Set "su" directive in config file to tell logrotate which user/group should be used for rotation.