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
相关推荐
hugerat1 小时前
在AI的帮助下,用C++构造微型http server
linux·c++·人工智能·http·嵌入式·嵌入式linux
ha20428941942 小时前
Linux操作系统学习记录之----自定义协议(网络计算器)
linux·网络·学习
想唱rap2 小时前
MYSQL在ubuntu下的安装
linux·数据库·mysql·ubuntu
糖~醋排骨2 小时前
DHCP服务的搭建
linux·服务器·网络
dust_and_stars2 小时前
ubuntu24使用apt安装VS-code-server code-server
linux·服务器·windows
码农小韩3 小时前
基于Linux的C++学习——循环
linux·c语言·开发语言·c++·算法
ling-453 小时前
Linux-day09 11
linux·运维·服务器
202321336054 刘3 小时前
Linux常用命令分类整理
linux·运维·数据库
南工孙冬梅3 小时前
【久久派】 新世界系统安装
linux
zbguolei3 小时前
Debian提示:“用户名” 不是 sudoers 文件
linux·服务器·debian