- 工信部备案号 滇ICP备05000110号-1
- 滇公网安备53011102001527号
- 增值电信业务经营许可证 B1.B2-20181647、滇B1.B2-20190004
- 云南互联网协会理事单位
- 安全联盟认证网站身份V标记
- 域名注册服务机构许可:滇D3-20230001
- 代理域名注册服务机构:新网数码
- CN域名投诉举报处理平台:电话:010-58813000、邮箱:service@cnnic.cn
欢迎来到8455线路检测中心技术小课堂,每天分享一个技术小知识。
在现代云计算和容器化环境中,日志管理是运维工作的核心。传统的 syslog系统虽然成熟,但在处理结构化日志、日志旋转和实时查询方面存在局限。systemd-journald作为 systemd 套件的一部分,提供了二进制、结构化的日志存储,支持丰富的元数据和高性能查询,是构建现代化集中日志系统的理想起点。本文将深入解析如何配置和利用 systemd-journald进行高效的日志管理。
特性 | syslog (rsyslog/syslog-ng) | systemd-journald |
日志格式 | 文本文件,非结构化 | 二进制,结构化存储 |
元数据 | 有限的固定字段 | 丰富的键值对(_TRANSPORT, _PID, _COMM, 等) |
存储效率 | 较低,纯文本 | 较高,二进制压缩 |
查询性能 | 依赖 grep,慢 | 索引化,毫秒级查询 |
系统集成 | 独立服务 | 与 systemd 深度集成 |
核心优势:journald 自动为每条日志记录附加超过 30 个元数据字段,如执行进程、用户、SELinux 上下文、内核消息等,无需应用额外配置。
默认情况下,journald 将日志存储在 /run/log/journal/(内存中),重启后丢失。必须配置持久化。
编辑 /etc/systemd/journald.conf:
[Journal]
# 启用持久存储
Storage=persistent
# 或混合模式:内存+磁盘
# Storage=auto
# 日志存储目录
SystemMaxUse=1G # 最大占用磁盘空间
SystemKeepFree=4G # 保持至少4G磁盘空闲
SystemMaxFileSize=100M # 单个日志文件最大大小
SystemMaxFiles=100 # 保留的最大文件数
MaxRetentionSec=1month # 最大保留时间
Compress=yes # 启用压缩
SyncIntervalSec=5m # 同步到磁盘的间隔
重启服务以生效:
sudo systemctl restart systemd-journald
验证配置:
# 检查日志目录
sudo ls -lh /var/log/journal/
# 查看当前配置
sudo journalctl --disk-usage
输出示例:
Archived and active journals take up 150.0M on disk.
# 查看二进制日志文件头信息
sudo journalctl --header
# 或查看特定文件的详细信息
sudo journalctl --file=/var/log/journal/abc.../system.journal --header
journalctl是 journald 的查询工具,功能强大。
# 查看所有日志(实时)
sudo journalctl -f
# 查看自上次启动以来的日志
sudo journalctl -b
# 查看特定启动的日志(-0 表示本次,-1 表示上次)
sudo journalctl -b -1
# 按时间范围查询
sudo journalctl --since "2024-01-01 00:00:00" --until "2024-01-02 12:00:00"
sudo journalctl --since yesterday
sudo journalctl --since "1 hour ago"
这是 journald 最强大的功能。
# 按服务/单元查询
sudo journalctl -u nginx.service
sudo journalctl -u docker.service --since today
# 按进程ID
sudo journalctl _PID=1234
# 按执行命令/进程名
sudo journalctl _COMM=sshd
sudo journalctl _EXE=/usr/sbin/sshd
# 按用户
sudo journalctl _UID=1000
sudo journalctl _SYSTEMD_OWNER_UID=1000
# 按优先级(syslog 级别)
sudo journalctl -p err
sudo journalctl -p 3 # 数字对应:0=emerg, 1=alert, 2=crit, 3=err, 4=warning, 5=notice, 6=info, 7=debug
sudo journalctl -p warning..err # 范围查询
# 组合查询
sudo journalctl -u nginx _PID=5678 -p err
# 显示所有可用字段
sudo journalctl -o verbose
# 自定义输出字段(JSON格式,便于解析)
sudo journalctl -u docker -o json
sudo journalctl -o json-pretty
# 仅显示特定字段
sudo journalctl -o json --output-fields=MESSAGE,_PID,_COMM,_SYSTEMD_UNIT
# 统计日志数量
sudo journalctl -u sshd --since today | wc -l
journald 支持通过网络将日志发送到远程服务器,构建集中日志系统。
在日志服务器(如 192.168.1.100)上编辑 /etc/systemd/journald.conf:
[Journal]
ForwardToSyslog=no
# 监听端口,默认 19532
ListenStream=0.0.0.0:19532
# 或使用 UNIX socket
# ListenStream=/run/systemd/journal/socket
创建 systemd socket 单元覆盖配置:
sudo systemctl edit systemd-journald.socket
输入:
[Socket]
ListenStream=0.0.0.0:19532
# 允许远程主机连接
SocketMode=0666
重启服务:
sudo systemctl daemon-reload
sudo systemctl restart systemd-journald.socket
在需要发送日志的客户端编辑 /etc/systemd/journald.conf:
[Journal]
# 转发到远程服务器
ForwardToSyslog=no
RemoteServer=192.168.1.100:19532
# 或通过 SSH 隧道转发(更安全)
# ForwardToWall=no
# 压缩传输
Compress=yes
# 网络超时
TimeoutSec=30
注意:journald 远程传输默认不加密,建议在可信网络或通过 VPN/SSH 隧道使用。
更安全的远程日志收集方案:
# 在客户端创建 SSH 隧道
ssh -f -N -L 19532:localhost:19532 user@192.168.1.100
# 配置 journald 通过本地隧道端口转发
# 在 /etc/systemd/journald.conf 中设置
RemoteServer=localhost:19532
8455线路检测中心官网上拥有完善的技术支持库可供参考,大家可自行查阅,更多技术问题,可以直接咨询。同时,8455线路检测中心整理了运维必备的工具包免费分享给大家使用,需要的朋友可以直接咨询。
更多技术知识,8455线路检测中心期待与你一起探索。
售前咨询
售后咨询
备案咨询
二维码

TOP