Akemi

日志轮转logrotate与即时清理truncate

2026/03/04

logrotate服务

logrotate适合大多数系统日志和应用日志,支持按“大小、时间、个数”配置规则

通过cron(systemd-timer)定时执行,自动检测并执行所有预设轮转机制

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/etc/logrotate.conf
/etc/logrotate.d/

echo "
/var/log/firewalld_deny.log {
daily
missingok
rotate 7
copytruncate
minsize 1M
create 0600 root root
postrotate
systemctl reload rsyslog > /dev/null 2>&1
endscript
}" >> /etc/logrotate.d/firewalld

# 检查配置语法是否正确
logrotate -d /etc/logrotate.d/firewalld

# 执行 logrotate(-f 强制执行,-v 显示详细信息)
logrotate -fv /etc/logrotate.d/firewalld

# 查看原日志,已经切割了
ls /var/log/firewalld_deny.log*
/var/log/firewalld_deny.log /var/log/firewalld_deny.log.1

配置参数

参数类别 参数名称 说明 示例
轮转频率 daily 每天轮转一次 daily
weekly 每周轮转一次 weekly
monthly 每月轮转一次 monthly
yearly 每年轮转一次 yearly
size 文件达到指定大小时轮转 size 10M
maxsize 按大小轮转,优先级高于时间周期 maxsize 100M
minsize 文件大于指定大小时才按时间轮转 minsize 1M
文件保留 rotate 保留的旧日志文件数量 rotate 7
maxage 删除超过指定天数的旧日志 maxage 30
start 轮转文件从指定数字开始编号 start 100
压缩设置 compress 使用gzip压缩旧日志 compress
nocompress 不压缩旧日志 nocompress
delaycompress 延迟压缩(下次轮转时压缩上一个文件) delaycompress
compressext 指定压缩文件后缀 compressext .gz
compressoptions 压缩命令的额外选项 compressoptions --best
文件操作 create 轮转后创建新文件并设置权限 create 0644 root root
nocreate 不创建新文件 nocreate
copytruncate 复制原文件后截断,避免重启服务 copytruncate
nocopytruncate 不复制截断 nocopytruncate
ifempty 即使文件为空也轮转 ifempty
notifempty 如果文件为空则不轮转 notifempty
missingok 日志文件不存在时不报错 missingok
nomissingok 日志文件不存在时报错(默认) nomissingok
olddir 将旧日志移动到指定目录 olddir /var/log/old
noolddir 旧日志保留在原目录 noolddir
extension 为轮转文件指定扩展名 extension .log
时间格式 dateext 使用日期作为轮转文件后缀 dateext
dateformat 指定日期格式 dateformat -%Y%m%d
脚本执行 prerotate 轮转前执行的脚本 prerotate ... endscript
postrotate 轮转后执行的脚本 postrotate ... endscript
firstaction 第一次匹配到日志文件时执行 firstaction ... endscript
lastaction 所有文件轮转完成后执行 lastaction ... endscript
preremove 删除旧日志前执行 preremove ... endscript
其他配置 sharedscripts 多个文件匹配时只运行一次脚本 sharedscripts
nosharedscripts 每个文件都运行脚本(默认) nosharedscripts
su 以指定用户/组执行轮转 su www-data www-data
include 包含指定目录的配置文件 include /etc/logrotate.d
tabooext 添加或重置不轮转的扩展名列表 tabooext + .bak .backup

truncate命令

logrotate实际上每次执行会创建新文件

如果已经有一个单个日志文件达到了100G,现在需要对这个日志文件进行临时处理,并且因为这是容器的日志,所以要求不修改元数据的情况下对日志进行清空(相当于不使用新文件),不然docker就无法识别新的日志了

truncate -s 0 /path/to/your/large.log

CATALOG
  1. 1. logrotate服务
  2. 2. truncate命令