Ubuntu 日志记录策略设置指南
一 架构与关键组件
- 现代 Ubuntu 采用两级日志体系:内核与用户空间的systemd-journald负责采集与索引日志(结构化、二进制、支持按字段高效查询),传统的rsyslog负责按规则写入**/var/log下的文本文件,并可与 journald 协同工作。默认情况下,journald 的存储策略由Storage=auto控制:若/var/log/journal**存在则持久化,否则仅保存在内存(重启后丢失)。这一机制兼顾性能与取证需求,服务器环境通常建议启用持久化存储。
二 配置 systemd-journald(journalctl)
- 启用持久化日志(服务器推荐)
- 创建持久化目录并重启服务:
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald
- 验证:journalctl 应能读取重启前日志,且 ls /var/log/journal 可见数据。
- 设置存储与大小上限(/etc/systemd/journald.conf)
- Storage=persistent | volatile | auto(按需选择,服务器建议 persistent)
- SystemMaxUse=、SystemKeepFree=、MaxRetentionSec= 等控制磁盘占用与保留时长(示例:SystemMaxUse=1G)
- 修改后执行:sudo systemctl restart systemd-journald
- 常用查询与维护
- 按时间/服务查询:journalctl --since “2025-12-01” --until “2025-12-02” -u nginx
- 按级别过滤:journalctl -p err -b(-b 表示本次启动)
- 清理旧日志:sudo journalctl --vacuum-time=7d 或 --vacuum-size=500M
- 实时跟踪:journalctl -f
以上做法覆盖持久化、容量控制与日常查询,适合作为服务器的基础策略。
三 配置 rsyslog(文件与远程)
- 安装与启用
- Ubuntu 通常预装 rsyslog;如未安装:sudo apt update && sudo apt install rsyslog
- 启动与开机自启:sudo systemctl enable --now rsyslog
- 基本规则与文件输出
- 主配置:/etc/rsyslog.conf;建议将自定义规则放入**/etc/rsyslog.d/*.conf**(如 50-default.conf),便于维护。
- 典型规则示例(按设施/优先级写入不同文件;行首减号“-”表示异步写入以降低 I/O 峰值):
auth,authpriv.* /var/log/auth.log
cron.* /var/log/cron.log
kern.* /var/log/kern.log
mail.* -/var/log/mail.log
*.info;mail.none;authpriv.none;cron.none /var/log/syslog
- 远程日志(UDP/TCP)
- 服务端(接收):在 rsyslog 配置中启用模块与监听(示例)
module(load=“imudp”)
input(type=“imudp” port=“514”)
module(load=“imtcp”)
input(type=“imtcp” port=“514”)
- 客户端(发送):将所需日志转发到远程
. @192.0.2.10:514 # UDP
. @@192.0.2.10:514 # TCP
- 按来源条件转发(示例)
if $fromhost-ip == ‘192.168.1.100’ then @remote.example.com:514
& stop
- 修改后执行:sudo systemctl restart rsyslog
以上覆盖本地分类写入与远程集中式收集的常见场景,适配从小型到生产级部署。
四 日志轮转与保留(logrotate)
- 系统日志轮转(/etc/logrotate.d/rsyslog 示例)
/var/log/syslog {
weekly
rotate 52
compress
delaycompress
missingok
notifempty
create 0640 root adm
}
- 应用日志示例(/etc/logrotate.d/myapp)
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 root adm
}
- 测试与生效
- 手动触发测试:sudo logrotate -f /etc/logrotate.conf
- 常规由 cron 每日运行,无需额外干预
通过合理的周期、保留份数与压缩策略,可避免磁盘被日志撑满并兼顾取证需求。
五 实践建议与排错
- 策略组合建议
- 服务器:启用journald 持久化,设置合理的 SystemMaxUse;rsyslog 负责落盘与远程集中;logrotate 控制本地保留周期与压缩。
- 容器/短暂环境:journald 使用volatile减少磁盘占用;必要时仅将关键日志转发至宿主机或集中式系统。
- 快速排错清单
- 服务状态:systemctl status systemd-journald rsyslog
- 端口连通:ss -lunpt | grep 514(UDP/TCP)
- 规则语法:rsyslogd -N1(语法检查)
- 实时观察:journalctl -f 与 tail -f /var/log/syslog 交叉验证
- 权限与目录:/var/log 与 /var/log/journal 属主应为root:adm,权限合理(如 0755/0640)
以上做法可快速定位常见配置与服务可用性问题的根因。