Linux系统日志管理

日志文件作用

日志文件用于记录linux系统的各种运行信息的文件,相当于linux主机的日记,不同的日志文件记载了不同类型的信息,如Linux内核消息、用户登录事件、程序错误等。日志文件对于诊断和解决问题很有帮助,因为linux运行的程序通常把系统的消息和错误写入对应的日志文件,这样系统可以有据可查, 此外,当主机遭受攻击时,日志文件还可以帮助寻找攻击者留下的痕迹。

几种日志管理工具的介绍

在 Linux 系统中,日志管理主要由 rsyslog/syslog 或 systemd-journald 负责,具体取决于系统配置和发行版。以下是判断系统使用哪种日志管理工具的方法:

方法systemd-journaldrsyslog/syslog
检查服务状态systemctl status systemd-journaldsystemctl status rsyslog
日志存储位置/var/log/journal/(二进制)/var/log/messages 或 /var/log/syslog(文本)
查看日志命令journalctlcat /var/log/syslog
配置文件/etc/systemd/journald.conf/etc/rsyslog.conf

注:存在系统同时存在两者的情况。使用“systemctl status systemd-journald”或“systemctl status rsyslog”命令查看服务状态之后,按字母"q"可以退出查看状态回到命令行模式。

区别

特性systemd-journaldrsyslog / syslog
所属体系由 systemd 提供(现代 Linux 默认)传统日志系统(syslog 是基础,rsyslog 是增强版)
日志格式二进制(不可直接编辑)纯文本(可直接用 cat/grep 查看)
存储位置/var/log/journal/(持久化)或内存(临时)/var/log/syslog/var/log/messages 等
日志查看工具journalctlcattailgrep 等文本工具
结构化数据支持元数据(如进程ID、用户、时间戳等)仅支持简单文本,无结构化字段
日志过滤支持高级过滤(如按服务、优先级、时间)依赖 grep/awk 等工具过滤
日志转发可转发到 rsyslog、控制台等可接收 journald 转发的日志并存储到文件
依赖关系依赖 systemd(仅限现代系统)独立运行,兼容所有 Linux 发行版

相似之处

特性共同点
日志收集两者都负责收集系统、内核和应用程序的日志。
优先级分类均支持标准日志级别(emerg/alert/crit/error/warning/info/debug)。
多源日志整合都能接收来自内核、系统服务和应用程序的日志。
网络日志转发均支持将日志转发到远程服务器(需配置)。
共存关系现代 Linux 通常同时运行两者:journald 做初步处理,rsyslog 做持久化存储。

 rsyslog / syslog日志管理工具

博主在学习时借鉴的以下文章linux日志总结 - z2n3 - 博客园(该文章讲解的较为详细,有需要的可以直接跳转)。

systemd-journald日志管理工具

systemd-journald 默认将所有日志统一存储在二进制文件中(通常位于 /var/log/journal/ 或内存中,且按照时间顺序存储,即第一行存储的日志时间比最后一行存储的日志时间要早),而不会像 rsyslog 那样按类型分割成多个文本文件(如 syslog、auth.log 等)。

systemd-journald 的日志以二进制格式 存储,其内容并非纯文本,而是带有结构化元数据的高效存储格式。以下是其内容格式的详细说明:

日志文件结构

  • 日志文件通常命名为 <machine-id>.journal 或带时间戳的分片文件(如 user-1000@abcd1234.journal,当日志文件达到一定大小或时间限制时会分片)。

  • 路径示例:

    /var/log/journal/abcd1234abcd1234abcd1234abcd1234/
        system.journal          # 系统日志
        user-1000.journal       # 用户日志(UID=1000)
  • 使用结构化存储(类似于数据库),包含日志内容,元数据(时间戳、服务名、优先级),索引等

日志记录的字段(元数据) 

每条日志记录包含多个字段,可通过 journalctl -o json-pretty 查看完整结构(按"q"键可退出查看日志模式回到命令行模式)。常见字段如下:

字段名说明
_SOURCE_REALTIME_TIMESTAMP日志时间戳(微秒级精度,UTC)。
_SYSTEMD_UNIT关联的 systemd 服务(如 nginx.service)。
_PID进程 ID。
_UID用户 ID。
_GID组 ID。
_COMM进程名称(如 sshd)。
_EXE进程可执行文件路径(如 /usr/sbin/sshd)。
_MESSAGE日志的原始内容(相当于传统日志的文本行)。
_PRIORITY日志级别(0=emerg, 1=alert, ..., 6=info, 7=debug)。
_HOSTNAME主机名。
_BOOT_ID系统启动 ID(用于区分不同启动周期的日志)。
_TRANSPORT日志来源(如 journalsyslogkernel)。

_TRANSPORT(日志来源)字段解释:

来源类型说明典型日志示例
journal由应用程序直接通过 sd-journal API 写入 journald(结构化日志)。现代服务(如 systemd 管理的服务)通过此方式记录日志。
syslog通过传统的 syslog 协议接收的日志(如 rsyslog 转发或旧版应用)。旧版应用(如 cronpostfix)或未适配 journald 的进程。
kernel内核发出的日志(如 dmesg 的内容)。硬件事件、驱动错误、内核崩溃信息(kernel: USB device disconnected)。
stdout/stderr从服务的标准输出(stdout)或错误输出(stderr)捕获的日志。容器或后台服务的打印输出(如 nginx: [notice] worker process started)。
audit来自 Linux 审计系统(auditd)的安全日志。用户登录、文件访问等审计事件(audit: USER_LOGIN uid=1000)。
driver特定设备驱动或内核模块的日志。显卡驱动、网络设备的调试信息。

 查看日志常用命令

1. 基础查看命令
命令说明示例
journalctl查看全部日志(分页显示,按 q 退出)journalctl
journalctl -xe查看最新日志并跳转到末尾(-e 结尾,-x 解释错误码)journalctl -xe
journalctl -f实时跟踪最新日志(类似 tail -f,按 Ctrl+C 退出)journalctl -f

2. 按时间过滤
命令说明示例
journalctl --since "YYYY-MM-DD HH:MM:SS"查看指定时间之后的日志journalctl --since "2024-01-01 12:00:00"
journalctl --until "YYYY-MM-DD HH:MM:SS"查看指定时间之前的日志journalctl --until "2024-01-02 00:00:00"
journalctl --since "1 hour ago"相对时间查询journalctl --since "2 days ago"

3. 按服务/单元过滤
命令说明示例
journalctl -u <unit>查看指定 systemd 服务的日志journalctl -u nginx
journalctl _SYSTEMD_UNIT=<unit>同上(精确匹配字段)journalctl _SYSTEMD_UNIT=sshd.service
journalctl --user-unit=<unit>查看用户级服务的日志journalctl --user-unit=vlc

4. 按优先级(日志级别)过滤
命令说明示例
journalctl -p <level>按优先级过滤(emerg(0) alert(1) crit(2) err(3) warning(4) notice(5) info(6) debug(7))journalctl -p err
journalctl -p err..alert查看错误到严重级别的日志journalctl -p warning..crit

5. 按进程/用户过滤
命令说明示例
journalctl _PID=<pid>查看指定进程的日志journalctl _PID=1234
journalctl _UID=<uid>查看指定用户的日志journalctl _UID=1000
journalctl _COMM=<name>按进程名过滤journalctl _COMM=sshd

6. 高级过滤与字段查询
命令说明示例
journalctl _TRANSPORT=<type>按日志来源过滤(kernel/syslog/journal 等)journalctl _TRANSPORT=kernel
journalctl _BOOT_ID=<id>查看特定启动周期的日志journalctl _BOOT_ID=abcd1234
journalctl -k仅查看内核日志(等效于 dmesgjournalctl -k

7. 输出格式控制
命令说明示例
journalctl -o jsonJSON 格式输出(适合脚本处理)journalctl -o json
journalctl -o json-pretty格式化 JSON 输出journalctl -o json-pretty
journalctl -o verbose显示所有元数据字段journalctl -o verbose
journalctl --no-pager直接输出到终端(不分页)journalctl --no-pager
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值