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
相关推荐
我好饿127 分钟前
elk日志系统
linux·log
Nimsolax28 分钟前
Linux线程互斥与同步
linux
dessler1 小时前
Hadoop HDFS-回收站(Trash)
linux·运维·hdfs
张童瑶1 小时前
Linux Cent OS7离线安装Go环境(最新版本)
linux·运维·golang
椎名澄嵐1 小时前
★ Linux ★ 信号
linux·运维·服务器·开发语言·c++
牛奶咖啡132 小时前
Linux中实现可执行文件或脚本在全局可用
linux·设置可执行程序全局可用·设置脚本全局可用·linux默认执行目录·linux环境变量
情深不寿3172 小时前
传输层————TCP
linux·网络·c++·tcp/ip
christine-rr2 小时前
【25软考网工】第五章(10) Internet应用
linux·网络·经验分享·笔记·软考
Arenaschi6 小时前
Android
android·linux·运维·笔记·其他·docker
敲上瘾6 小时前
Docker多容器编排:Compose 实战教程
linux·运维·docker·容器·架构