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
相关推荐
DARLING Zero two♡1 小时前
【Linux操作系统】简学深悟启示录:进程控制
linux·运维·服务器
wheeldown3 小时前
【Linux】为什么死循环卡不死 Linux?3 个核心逻辑看懂进程优先级与 CPU 调度密码
linux·运维·服务器·开发语言·c++·unix·进程
xxy.c3 小时前
嵌入式解谜日志-网络编程(udp,tcp,(while循环原理))
linux·运维·c语言·开发语言·数据结构
守.护5 小时前
云计算学习笔记——Linux系统网络配置与远程管理(ssh)篇
linux·运维·服务器·ssh·linux网络配置
津津有味道5 小时前
15693协议ICODE SLI 系列标签应用场景说明及读、写、密钥认证操作Qt c++源码,支持统信、麒麟等国产Linux系统
linux·c++·qt·icode·sli·15693
Lynnxiaowen7 小时前
今天我们继续学习shell编程语言的内容
linux·运维·学习·云计算·bash
喜欢你,还有大家9 小时前
Linux笔记14——shell编程基础-8
linux·前端·笔记
skywalk81639 小时前
mayfly-go:web 版 linux、数据库等管理平台
linux·运维·数据库
dbdr09019 小时前
Linux 入门到精通,真的不用背命令!零基础小白靠「场景化学习法」,3 个月拿下运维 offer,第二十四天
linux·运维·c语言·python·学习
绵绵细雨中的乡音10 小时前
简易TCP网络程序
linux·网络