Ubuntu 日志大小限制
systemd-journald、rsyslog 和 logrotate 这三者的概念,请阅读《Ubuntu 日志系统简介》。
参考链接
1 systemd-journald
1.1 日志存储位置
- 存储位置:集中存储在
/run/log/journal/(临时)或/var/log/journal/(持久化)
1.2 基础命令
- 以系统每次启动,列出所有日志
journalctl --list-boots
- 查看某次启动的日志
journalctl -b 0 # 本次启动
journalctl -b -1 # 上次启动
- 查看存储控件占用大小
journalctl --disk-usage
1.3 日志大小配置
- 配置文件位置
vim /etc/systemd/journald.conf
- 文件内容如下
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See journald.conf(5) for details.
[Journal]
Storage=persistent
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
SystemMaxUse=60M
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
ForwardToSyslog=no
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K
#ReadKMsg=yes
1.4 参数解析
如果想修改日志的总大小,只修改SystemMaxUse字段即可!
Storage
- persistent - 指定了日志持久化存储,会存储在/var/log/journal/下面
- volatile - 仅保存在/run/log/journal,关机后该目录自动消失
- none - 表示不保存任何日志(直接丢弃所有收集到的日志), 但日志转发不受影响
- auto - 有/var/log/journal/目录时是persistent行为,没有该目录时则为volatile行为
(支持 K, M, G, T 等单位):
SystemMaxUse(总大小限制)
- 作用:限制日志在磁盘上占用的总最大硬盘空间。
- 当前状态:在你的配置中,这一行已经被启用并设置为
SystemMaxUse=60M。这意味着所有系统日志加起来最多只会占用 60MB 的空间。如果达到这个值,旧的日志会被自动删除。
SystemKeepFree(保留空闲空间)
- 作用:确保日志不会占满整个磁盘,强制为系统保留指定的最小磁盘空闲空间。
journald会在SystemMaxUse和SystemKeepFree之间取对日志限制更严格的一个。
SystemMaxFileSize(单文件大小)
- 作用:限制单个日志文件的最大大小。当当前日志文件达到此大小时,会触发日志轮转(生成新的日志文件)。默认值通常是
SystemMaxUse的 1/8。
SystemMaxFiles(文件数量限制)
- 作用:限制保留的日志文件最大数量。在你的配置中,默认建议值为 100。
ForwardToSyslog: 配置为yes时,日志会转发给rsyslog,该选项默认为yes,所以如果不想转发,必须去掉注释,显式写no (如果转发了,意味着相同的日志内容,systemd-journald会存一份,rsyslog也会存一份)
1.5 应用与验证
- 应用
sudo systemctl restart systemd-journald - 验证
sudo systemctl status systemd-journald输出中可看到日志总大小已经受到限制了
● systemd-journald.service - Journal Service
Loaded: loaded (/lib/systemd/system/systemd-journald.service; static; vendor preset: enabled)
Active: active (running) since Mon 2026-06-29 18:38:30 CST; 8s ago
TriggeredBy: ● systemd-journald-dev-log.socket
● systemd-journald.socket
● systemd-journald-audit.socket
Docs: man:systemd-journald.service(8)
man:journald.conf(5)
Main PID: 1575 (systemd-journal)
Status: "Processing requests..."
Memory: 992.0K
CGroup: /system.slice/systemd-journald.service
└─1575 /lib/systemd/systemd-journald
6月 29 18:38:30 rk3568 systemd-journald[1575]: Journal started
6月 29 18:38:30 rk3568 systemd-journald[1575]: System Journal (/var/log/journal/770d7b2141af4dd19bbc290d450aaa68) is 80.0M, max 1000.0M, 919.9M free.
6月 29 18:38:30 rk3568 systemd-journald[1575]: System Journal (/var/log/journal/770d7b2141af4dd19bbc290d450aaa68) is 80.0M, max 1000.0M, 919.9M free.
2 rsyslog
2.1 日志存储位置
/var/log下,有kern.log syslog,比如
-rw-r----- 1 syslog adm 171101 3月 19 17:08 kern.log
-rw-r----- 1 syslog adm 7368349 3月 18 16:19 kern.log.1
-rw-r----- 1 syslog adm 8273 3月 18 11:43 kern.log.2.gz
-rw-r----- 1 syslog adm 20 3月 27 2025 kern.log.3.gz
-rw-r----- 1 syslog adm 171101 3月 19 17:08 syslog
-rw-r----- 1 syslog adm 8197238 3月 18 16:19 syslog.1
-rw-r----- 1 syslog adm 27156 3月 18 11:43 syslog.2.gz
-rw-r----- 1 syslog adm 20 3月 27 2025 syslog.3.gz
2.2 日志规则
主配置:/etc/rsyslog.conf 模块及自定义规则:/etc/rsyslog.d/*.conf
3 logrotate
logrotate 用于管理 rsyslog 的日志。
3.1 日志大小配置
vim /etc/logrotate.d/rsyslog
内容如下
/var/log/syslog
{
su root syslog
rotate 7
daily
maxsize 5M
missingok
notifempty
delaycompress
compress
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
su root syslog
rotate 4
weekly
maxsize 5M
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
3.2 参数解析
su root syslog: 这个配置和/var/log目录的所有者,所有组,以及权限有关
rotate: 日志轮转份数,比如7就表示日志最多存7份
轮转间隔: hourly daily weekly monthly yearly
maxsize: 每份日志的最大大小,超过此大小,将无视轮转间隔提前轮转(logrotate 3.8以上支持) 但是这里有个容易误解的点,误以为只要日志一超过此大小,就会立刻触发轮转。但实际上,logrotate是一个由systemd管理的每日任务,每天触发时,如果maxsize满足条件,才会进行轮转,而不是实时跟踪的。也就是说,maxsize对于daily的轮转间隔并没有明显的效果(因为不管有没有maxsize,都是每天轮转一次),但是对于weekly此类大于daily的轮转间隔,只要maxsize达到要求,便会提前轮转。
size: 实际上,还有另外一个size参数,这个参数和轮转间隔是互斥的,表示日志文件在达到size大小时,才进行自动轮转(实测也需要等logrotate任务触发或者手动触发,由于没有daily等时间间隔选项,日志可以一直累计直到指定的size大小)
3.3 手动触发轮转
- debug模式,不真正执行
sudo logrotate -d /etc/logrotate.d/rsyslog
可以看到配置
rotating pattern: /var/log/syslog
after 1 days (7 rotations)
empty log files are not rotated
log files >= 5242880 are rotated earlier
每天轮转,保留 7 份,≥5MB 提前轮转,空文件不处理。
- 可能有如下报错,导致轮转失败
error: skipping "/var/log/syslog" because parent directory has insecure permissions
parent directory has insecure permissions
(It's world writable or writable by group which is not "root")
表示因为父目录权限不安全,跳过这个日志。 /var/log 目录权限:
- 对所有人可写(777 / 775)
- 或 group 不是 root 且可写
目录权限如下
ls -ld /var/log
drwxrwxr-x 16 root syslog 4096 3月 18 00:00 /var/log
则需要在/etc/logrotate.d/rsyslog中加入 su root syslog,问题解决。
3.4 自动触发轮转
旧版本应该都是用cron
cat /etc/cron.daily/logrotate
# skip in favour of systemd timer
if [ -d /run/systemd/system ]; then
exit 0
fi
如果系统使用 systemd,就直接退出,不用 cron
新版本使用systemd
- 查看当前timer状态
systemctl status logrotate.timer
- 查看定时策略
systemctl cat logrotate.timer
可以查看journald日志中的轮转记录
journalctl | grep logrotate
输出如下
3月 18 15:05:48 user systemd[1]: logrotate.timer: Succeeded.
3.5 手动触发轮转
sudo logrotate -vf /etc/logrotate.d/rsyslog
-v(–verbose):启用“详细”模式 -f(–force):“强制”进行轮转
留下评论