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
相关推荐
liuyao_xianhui17 小时前
版本控制器git--gdb/cgdb
linux·运维·服务器·git
CS_浮鱼17 小时前
【Linux进阶】mmap实战:文件映射、进程通信与LRU缓存
linux·运维·c++·缓存
chuxinweihui18 小时前
应用层协议 HTTP
linux·服务器·网络·网络协议·http
xu_yule18 小时前
Linux_16(多线程)信号量+基于环形队列的生成消费模型+自选锁+读写锁
linux·运维·服务器
4t4run19 小时前
25、Linux 特殊权限
linux·运维
氵文大师19 小时前
A机通过 python -m http.server 下载B机的文件
linux·开发语言·python·http
HUT_Tyne26520 小时前
Linux 快速入门
linux·运维·服务器
leoufung20 小时前
逆波兰表达式 LeetCode 题解及相关思路笔记
linux·笔记·leetcode
鸠摩智首席音效师20 小时前
如何在 Linux 中使用 dd 命令 ?
linux·运维·服务器
一夜空中最亮的星一20 小时前
【Linux】ubuntu24.04 安装docker
linux·docker·eureka