Zenith Horizon

Linux 日志系统详解

2026/03/20
loading

Linux 日志系统是操作系统记录事件、错误、调试信息以及各种服务运行状态的核心机制。了解日志系统的运行方式,并掌握常用日志工具的使用方法,对于系统管理员排查故障、监控系统健康以及安全审计都至关重要。下面我将从日志系统架构、常见日志工具、配置方法、查看与分析技巧等方面进行详细讲解。


1. Linux 日志系统概述

1.1 日志的作用

  • ​故障排查​:当系统或应用程序出现异常时,日志是定位问题的第一手资料。

  • ​安全审计​:记录用户登录、命令执行、权限变更等事件,用于追踪异常行为。

  • ​性能监控​:通过日志分析系统负载、资源使用趋势。

  • ​合规要求​:许多行业标准要求保留操作日志。

1.2 Linux 日志系统的演变

早期的 Linux 使用 ​syslogd​(基于 RFC 3164)集中记录日志,后来发展出功能更强大的 ​rsyslog​、​syslog-ng​。随着 systemd 的普及,引入了 ​systemd-journald​,它与系统和服务管理器紧密结合,提供结构化日志和更丰富的查询功能。现代 Linux 发行版通常同时运行 rsyslog 和 journald,二者可协同工作(journald 将日志转发给 rsyslog 持久化存储)。


2. 日志的生成与分类

2.1 日志的生成者

  • ​内核​:通过 printk​ 输出到内核环缓冲区(可通过 dmesg​ 查看)。

  • ​系统服务​:如 cron、sshd、httpd 等,使用 syslog 库或直接写入文件。

  • ​用户应用程序​:可自定义日志输出方式,通常也使用 syslog 接口。

  • ​systemd 管理的服务​:默认将 stdout/stderr 输出捕获到 journald。

2.2 日志的分类(facility 与 priority)

在 syslog 协议中,每条日志消息都有 ​facility​(设备/子系统)和 ​priority​(严重等级)。
常见 facility 值:auth​、authpriv​、cron​、daemon​、kern​、lpr​、mail​、news​、syslog​、user​、local0~local7​ 等。
priority 从低到高:debug​、info​、notice​、warning​、err​、crit​、alert​、emerg​。


3. 日志的存储方式

3.1 传统文本日志(/var/log/)

  • ​/var/log/messages​:大部分系统日志(如启动信息、应用程序错误)。

  • ​/var/log/secure​:认证与安全相关日志(如 SSH 登录、sudo 使用)。

  • ​/var/log/maillog​:邮件服务日志。

  • ​/var/log/cron​:计划任务执行日志。

  • ​/var/log/boot.log​:系统启动日志。

  • ​/var/log/dmesg​:内核环缓冲区消息(可用 dmesg​ 命令查看)。

  • 应用特定的日志:如 /var/log/nginx/access.log​、/var/log/mysql/error.log​。

3.2 二进制日志(systemd journal)

systemd-journald 将日志存储在二进制格式的文件中(默认 /run/log/journal/​ 或 /var/log/journal/​)。优点是包含元数据(如 PID、UID、时间戳、服务名等),支持结构化查询,缺点是不能直接用文本编辑器查看。


4. 日志收集与转发工具

4.1 rsyslog

目前大多数发行版默认的 syslog 实现。它支持模块化扩展、多种输入/输出方式、可靠的传输协议(如 RELP)、日志过滤和格式化。

配置文件

主配置文件:/etc/rsyslog.conf​
规则定义通常存放在 /etc/rsyslog.d/*.conf​ 中。

规则语法

facility.priority    action

例如:

authpriv.*              /var/log/secure
*.info;mail.none;authpriv.none;cron.none    /var/log/messages
  • ​*​ 表示所有优先级。

  • ​;​ 分隔多个选择器。

  • ​none​ 排除某类日志。

action 可以是文件路径、管道(如 |/dev/ps​)、远程主机(如 @192.168.1.100:514​)、用户列表(如 root​)等。

常用模块

  • ​imuxsock​:接收本地 syslog 调用。

  • ​imklog​:接收内核日志。

  • ​imjournal​:从 systemd-journal 导入日志(实现 journald 与 rsyslog 协同)。

  • ​omfwd​:转发日志到远程服务器。

  • ​omfile​:写入文件。

  • ​mysql/pgsql​:将日志写入数据库。

配置示例:将 local0 级别的日志单独存文件

在 /etc/rsyslog.d/local.conf​ 中添加:

local0.*    /var/log/local.log

重启 rsyslog:systemctl restart rsyslog​

4.2 systemd-journald

systemd 的日志守护进程,收集内核、initrd 以及系统服务的日志。默认将日志保存在内存中(/run/log/journal​),可配置为持久化(创建 /var/log/journal​ 目录)。

配置文件

​/etc/systemd/journald.conf​ 常用选项:

  • ​Storage=auto​:决定日志存储方式(auto/persistent/volatile/none)。

  • ​Compress=yes​:是否压缩归档日志。

  • ​SystemMaxUse=​:限制日志占用的磁盘空间。

  • ​ForwardToSyslog=yes​:将日志转发给传统的 syslog 守护进程(如 rsyslog)。

与 rsyslog 协作

通常 journald 负责收集,rsyslog 从 journald 读取(通过 imjournal 模块)并写入文本文件。这样既保留了结构化日志,又能使用传统工具处理。


5. 日志查看与分析工具

5.1 基本文本工具

  • cat / less / ​more​:直接查看文本日志文件。
    ​less /var/log/messages​

  • ​tail​:实时跟踪日志文件变化。
    ​tail -f /var/log/secure​ # 动态显示新增行

  • ​grep​:过滤关键词。
    ​grep "Failed password" /var/log/secure​

  • awk / ​sed​:进行更复杂的文本处理。
    ​awk '{print $1, $2, $3, $9}' /var/log/secure​ # 提取日期和用户

  • ​cut​、​sort​、uniq 等组合使用。

5.2 journalctl:查询 systemd 日志

​journalctl​ 是查看 journal 日志的主要命令,功能强大。

基本用法

  • ​journalctl​:显示所有日志(从当前启动开始,如果持久化则包括历史)。

  • ​journalctl -f​:实时跟踪新日志。

  • ​journalctl -u sshd.service​:查看指定 systemd 单元的日志。

  • ​journalctl -p err -b​:查看本次启动的错误级别以上日志。

  • ​journalctl --since "2025-02-10 10:00" --until "2025-02-10 11:00"​:指定时间范围。

  • ​journalctl -o verbose​:以详细格式显示,包含所有字段。

  • ​journalctl _PID=1234​:按特定字段过滤(可用 -F​ 查看可用字段)。

持久化查询

如果配置了持久化(存在 /var/log/journal​),journalctl​ 可以查询历史启动记录,加上 -b 0​(本次启动)、-b -1​(上一次启动)等。

5.3 专用分析工具

  • ​lnav​:终端下的日志文件浏览器,支持语法高亮、时间轴、自动加载新行。
    ​lnav /var/log/messages​

  • ​logwatch​:生成每日日志摘要报告,可发送邮件或输出到终端。

  • ​logcheck​:监控异常日志并发送警告。

  • ​GoAccess​:实时分析 Web 服务器访问日志(如 Apache、Nginx)。


6. 日志管理与轮转(logrotate)

为了避免日志文件无限增长,需要定期轮转(rotate)、压缩、删除旧日志。logrotate​ 是标准的日志轮转工具,通常由 cron 每天执行。

6.1 配置文件

主配置:/etc/logrotate.conf​
服务特定配置:/etc/logrotate.d/​ 下的文件。

6.2 常用指令

/var/log/secure {
    weekly                # 每周轮转一次
    rotate 4              # 保留最近4个归档
    create 0600 root root # 轮转后创建新文件,并设置权限
    compress              # 压缩归档(默认gzip)
    delaycompress         # 推迟一次压缩(与compress联用)
    missingok             # 如果日志文件丢失,忽略错误
    notifempty            # 空文件不轮转
    sharedscripts         # 对多个日志文件只执行一次postrotate脚本
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

6.3 手动测试

  • ​logrotate -d /etc/logrotate.conf​:调试模式,显示要执行的操作。

  • ​logrotate -f /etc/logrotate.conf​:强制立即轮转。

6.4 journald 日志的清理

journal 日志本身也会轮转和限制大小,通过配置 SystemMaxUse​ 等参数。手动清理:

  • ​journalctl --vacuum-size=100M​:保留最近 100M 日志。

  • ​journalctl --vacuum-time=2weeks​:保留最近两周日志。


7. 集中式日志管理简介

对于多台服务器,通常会将日志集中到一台日志服务器上,便于统一分析。常用方案:

  • ​rsyslog 客户端​:在每台机器上配置转发规则,将日志发送到中央 rsyslog 服务器。
    客户端:*.* @192.168.1.100:514​
    服务器:启用 imtcp 或 imudp 模块接收,并写入文件。

  • ​ELK Stack​(Elasticsearch, Logstash, Kibana):功能强大,支持全文搜索、可视化。

  • ​Graylog​:类似 ELK,但更侧重于日志管理。

  • ​Fluentd / Fluent Bit​:轻量级日志收集器,可与多种后端集成。


8. 总结

Linux 日志系统是一个多层次、多工具的体系:

  • ​日志生成​:内核、系统服务、应用程序通过 syslog 或直接写入文件产生日志。

  • ​日志收集​:systemd-journald 负责捕获所有日志,rsyslog 等传统守护进程可进行过滤、转发和存储。

  • ​日志存储​:文本文件(/var/log/)便于传统工具查看,二进制 journal 便于结构化查询。

  • ​日志查看​:tail​、grep​、journalctl​ 是最常用的命令,lnav​ 等工具提供增强体验。

  • ​日志管理​:logrotate 控制日志轮转和清理,避免磁盘耗尽。

  • ​集中式日志​:通过 rsyslog 转发或 ELK 等工具实现跨服务器日志分析。

掌握这些概念和工具,能够有效提升你在 Linux 环境下的故障排查和系统维护能力。建议多动手实践,查看自己系统上的日志,尝试过滤和分析,并定制日志收集策略。

Author: Max

Permalink: /archives/linux-log

Published: 2026-03-20 18:43:57

Updated: 2026-03-20 18:43:41

License: 本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG