
本文教你在 systemd 主导的现代发行版上把 journal 日志用好用稳,覆盖持久化、磁盘配额、轮转策略、高频查询、与 rsyslog 协同与远程转发等核心场景。读完你会拿到三件直接可用的产出:一份 journald 推荐配置模板、一份高频排错查询命令清单、以及针对日志爆盘、查询慢与容器日志归集的处理路径。
一、journal 与 rsyslog 的关系
systemd 默认日志后端是 journald,把日志以二进制结构存到 /var/log/journal/,能保留进程号、用户号、单元名、优先级等结构化字段,用 journalctl 查询非常方便。传统的 rsyslog 仍可与之共存:journald 写完后通过 imjournal 模块把日志转给 rsyslog,rsyslog 再按规则写到 /var/log/messages 等文本文件,便于已有的日志聚合脚本继续运行。
为什么困惑两套日志?发行版默认不同:RHEL 与 CentOS 系列两套协同共存;Debian 与 Ubuntu 新版本默认只用 journald。容器化时代更推荐 journald 作为单一后端,配合 Promtail 或 Vector 把结构化日志拉到 Loki 或 ELK 集中分析,再配合监控告警形成统一观测面板,相关选型可参考 云服务器选购指南。
二、持久化与磁盘配额
journald 默认把日志放 /run/log/journal/,重启后丢失。要持久化必须创建 /var/log/journal/ 目录或在 /etc/systemd/journald.conf 配置里显式开启。推荐配置:Storage=persistent 启用持久化,SystemMaxUse=2G 限制 journal 最大磁盘占用、超过自动删旧文件,SystemKeepFree=4G 保留磁盘可用空间、与前者取较小者生效,SystemMaxFileSize=128M 与 SystemMaxFiles=100 控制单文件与总文件数,MaxRetentionSec=30day 设最长保留 30 天,Compress=yes 启用压缩,Seal=yes 启用日志签名防篡改、安全审计场景必备,ForwardToSyslog=no 关闭重复写 syslog 节省 IO。改完 systemctl restart systemd-journald 重启服务,journalctl --disk-usage 看实际占用。Web 服务器访问日志关联可参考 美国 VPS 部署教程 的访问日志章节。
三、轮转:vacuum 系列命令
journal 是循环写入设计,到达 SystemMaxUse 后自动删旧。但有时候需要手动清理,比如磁盘告警时:
journalctl --vacuum-size=500M把日志压到 500MB 以内journalctl --vacuum-time=7d只保留 7 天journalctl --vacuum-files=10只保留 10 个文件journalctl --rotate强制立刻轮转一次
--vacuum-time 在事故应急时最常用:磁盘告警 90% 时一行命令立马腾出空间。日常运维建议把 SystemMaxUse 与 MaxRetentionSec 同时设好,让 journald 自动管理,不要依赖 cron 跑 vacuum。
四、高频查询命令
journalctl 的查询能力远超 grep + tail,掌握这几个组合命令能少走很多弯路:
journalctl -u nginx -f实时看某服务日志journalctl -u nginx --since "10 min ago"看最近 10 分钟journalctl -p err -b看本次启动后 error 及以上journalctl _SYSTEMD_UNIT=docker.service _PID=12345多条件过滤journalctl -u nginx -o json输出 JSON 给后续工具
-b 跟数字看历史启动:-b -1 上次、-b -2 上上次,对调试 kernel panic、OOM、boot 失败特别有用。-k 只看 kernel 消息,等价 dmesg 但带时间戳。多服务归集场景下 json 输出加 jq 是必备组合,详见 W3 Total Cache 调优实战。
五、远程转发与集中收集
journald 自带的远程上传与接收组件可把多台机器日志推到中心收集器,配置上传地址与证书路径后,中心节点接收并落到本地的远程目录。优点是协议原生、字段结构保留完整;缺点是只支持 systemd 体系。更通用的方案是用 vector 或 fluent-bit 监听 journal,转发到 Loki、Elasticsearch 或 Kafka 做统一处理。
容器日志归集要单独考虑:Docker 默认用 json-file 驱动写到本地容器目录,可以改用 journald 驱动让所有容器日志统一进入 journal,再走上面的转发链路。Kubernetes 节点用 Promtail 直接读 journal 是当前主流方案,落地时建议同时部署多副本接收端避免单点。
六、常见问题与排查
journald 常见问题及处理路径:
- 日志查询慢:journal 文件碎片化严重,跑一次
journalctl --rotate && journalctl --vacuum-time=30d重整 - 日志爆磁盘:SystemMaxUse 没设或设太大,按本文推荐改后重启 journald
- 服务日志看不到:检查 unit 文件是否设了 StandardOutput=null
- 容器 stdout 日志不进 journal:Docker 默认驱动不是 journald,按需修改 daemon.json
- 重启后日志丢失:没建 /var/log/journal/ 目录,Storage 还在默认 auto 上
journal 的二进制格式偶尔会损坏,表现为 “Corrupted file”,处理方法是停 journald 后把对应文件改名再重启,损坏的多是当前活动文件。调试期可临时调大 RateLimit 避免丢日志,生产环境恢复默认。相关运维文章见 WordPress 分类。
七、安全审计与合规对接
合规场景启用 Seal=yes 后 journalctl 用 HMAC 签名做防篡改,篡改可被 journalctl --verify 发现。journalctl --setup-keys 生成 FSS(前向安全密封)密钥,secret key 离线保管,建议每周或事件响应时验证一次。
审计还要配合 auditd 使用:auditd 抓系统调用与文件访问,journald 抓服务与内核消息覆盖互补,把 audit.log 通过 imuxsock 转给 journald 可统一查询关联事件。
八、日志检索性能优化
journal 数据量上百 GB 时查询会明显变慢,几个加速思路:缩短 MaxRetentionSec 把保留时长压到 7 天;提高 SystemMaxFileSize 让单文件变大到 256MB,减少文件总数与索引开销;用 --no-pager --output-fields=PRIORITY,MESSAGE 只取必要字段,I/O 量大幅下降;把热查询场景的关键日志同步到 Loki 或 Elasticsearch 走专门索引。
journal 自带索引在大数据量下性能一般,长期检索场景建议把 journal 当短期缓冲、外部系统做长期存档。容器密集节点上限速参数默认是十秒级窗口里一万条左右,业务突发时容易触发限速丢日志,建议改成五万条三十秒并把超限事件接入监控告警,避免事故现场反而看不到关键日志。如果是金融或医疗这类合规敏感行业,还应在归档层加上独立的只读副本与审计审签流程,确保日志链路从生成到长期存证都可追溯。
总结与建议
journald 是 systemd 时代的日志事实标准。建议你按本文顺序落地:先开启持久化与磁盘配额、再练熟 journalctl 高频查询、最后按规模选择转发与归集方案。多机统一管理可以考虑用 Ansible 下发 journald.conf,中心节点部署 Loki 做长期检索。遇到不可解释的故障第一时间 journalctl 而不是 grep,长期看能为团队省下大量时间。