linux 日志详解

下面把图里的两条路径(有 rsyslog / 无 rsyslog)做一次系统化说明,并给出关键配置、优缺点、常见故障点与快速自检命令。

有 rsyslog 的路径(传统兼容、易于转发)

数据流:

  1. 内核 kmsg / 应用日志

    • 内核:/dev/kmsg
    • 应用:printf/stdout/stderr(由 systemd 接管)、或 syslog() API → /dev/log
  2. systemd-journald 收集一切来源,形成二进制 journal。

  3. 转交给 rsyslog

    • 方式 A:journald 通过 UNIX socket /run/systemd/journal/syslog 转发
    • 方式 B:rsyslog 通过 imjournal 模块直接读 journald(更完整的元数据)
  4. rsyslog 做过滤、模板、落盘或远程转发:

    • 本地文本:/var/log/messages/var/log/secure
    • 远程:@host:514(UDP) / @@host:514(TCP/TLS)

关键配置:

  • /etc/systemd/journald.conf

    ini 复制代码
    [Journal]
    ForwardToSyslog=yes          # 让 journald 转发给 rsyslog(走方式A时需要)
    Storage=persistent           # 建议;持久化到 /var/log/journal
  • /etc/rsyslog.conf/etc/rsyslog.d/*.conf

    ini 复制代码
    module(load="imuxsock")      # 监听 journald 的 syslog 转发 (/run/systemd/journal/syslog)
    # 或/并
    module(load="imjournal" StateFile="imjournal.state")  # 直接读 journald(方式B)
    
    *.info;mail.none;authpriv.none;cron.none   /var/log/messages
    # 远程转发示例(UDP / TCP+TLS)
    *.*   @10.0.0.1:514
    *.*  @@log.example.com:6514

优点:

  • 兼容大量只认文本/rsyslog 的工具;易做远程集中(SIEM、ELK、Splunk)。
  • 强大的过滤/模板能力。

注意/缺点:

  • 文本落盘会丢失 journald 丰富的元数据(UNIT、PID、_SYSTEMD_CGROUP 等)。
  • 配置不当会重复采集(同时开 imuxsockimjournal 但又让 journald 转发)。

无 rsyslog 的路径(纯 journald)

数据流:

  1. 内核/应用 → systemd-journald

  2. 存储位置:

    • 默认易失/run/log/journal(重启丢失)
    • 持久化 :创建目录 mkdir -p /var/log/journal 并设 Storage=persistent 后写入此处
  3. journalctl 查询与导出;若需远程,可用 systemd-journal-remote、或 fluent-bit / vector / filebeat 等直接读取 journal。

常用命令:

csharp 复制代码
journalctl -f                         # 实时
journalctl -u sshd                    # 按服务
journalctl -k                         # 仅内核
journalctl --since today              # 时间范围
journalctl -o short-iso -b            # 本次启动、短格式

优点:

  • 原生结构化日志、索引查询快、字段丰富、压缩与限速内置。
  • 组件更少,维护简单。

注意/缺点:

  • 不会生成 /var/log/messages 文本;部分传统工具不兼容。
  • 远程集中需额外组件(journal-remote 或日志代理)。

该如何选择?

  • 需要文本文件/兼容老工具/现有 SIEM 走 syslog → 保留 rsyslog
  • 更看重结构化与简单链路 ,且上游可直接读 journal → 纯 journald + agent(fluent-bit/vector)或 journal-remote

常见故障点与定位思路

  1. /var/log/messages 长期没更新(在"有 rsyslog"场景):

    • rsyslog 未运行:systemctl status rsyslog
    • 规则缺失/被注释:检查 *.info ... /var/log/messages
    • journald 未转发:ForwardToSyslog=yes;重启 systemd-journald
    • Socket 未连通:lsof -U | grep journal/syslog
    • SELinux 拦截:getenforce;测试 setenforce 0
    • 磁盘/inode 满:df -h /var/log && df -i /var/log
  2. 纯 journald 场景重启后日志丢失:

    • 未持久化:创建 /var/log/journalStorage=persistent
  3. 重复日志:

    • 同时启用 ForwardToSyslog=yes + imjournal + imuxsock,要按实际选择一种路径避免重复。

快速自检清单(拷贝即用)

bash 复制代码
# 是否持久化 journald
test -d /var/log/journal && echo "journal: persistent" || echo "journal: volatile"

# journald 配置
grep -E '^(Storage|ForwardToSyslog)' /etc/systemd/journald.conf

# rsyslog 运行/错误
systemctl status rsyslog
journalctl -u rsyslog -n 50 --no-pager

# journald → rsyslog socket
lsof -U | grep '/run/systemd/journal/syslog'

# 写入测试
logger "smoke-test $(date)"
journalctl -n 5
tail -n 5 /var/log/messages  # 有 rsyslog 时验证

典型配置范例(可直接参考)

journald:

ini 复制代码
# /etc/systemd/journald.conf
[Journal]
Storage=persistent
ForwardToSyslog=yes   # 仅在需要 rsyslog 的场景
RateLimitIntervalSec=30
RateLimitBurst=1000

rsyslog(最小可用):

ini 复制代码
# /etc/rsyslog.d/00-basic.conf
module(load="imuxsock")
# 或用 imjournal,避免重复就不要再从 imuxsock 收
# module(load="imjournal" StateFile="imjournal.state")

# 本地落盘
*.info;mail.none;authpriv.none;cron.none    /var/log/messages

# 远程(按需)
# *.*  @10.0.0.1:514
# *.* @@log.example.com:6514
相关推荐
励志不掉头发的内向程序员15 小时前
【Linux系列】解码 Linux 内存地图:从虚拟到物理的寻宝之旅
linux·运维·服务器·开发语言·学习
woshihonghonga16 小时前
停止Conda开机自动运行方法
linux·人工智能·conda
遇见火星19 小时前
Ubuntu Docker 容器化部署教程
linux·ubuntu·docker
ybb_ymm20 小时前
mysql8在linux下的默认规则修改
linux·运维·数据库·mysql
半梦半醒*20 小时前
zabbix安装
linux·运维·前端·网络·zabbix
武文斌771 天前
复习总结最终版:单片机
linux·单片机·嵌入式硬件·学习
驱动探索者1 天前
贝尔实验室发展史:20世纪科技圣殿的辉煌与沉浮
linux
何朴尧1 天前
centos/cuos如何开启软件源
linux·运维·centos
YouEmbedded1 天前
解码Linux文件IO之标准IO
linux·文件io·系统io
撬动未来的支点1 天前
【Linux内核】Linux内核裁剪完全指南:从理论到实战的系统优化
linux