日志文件作用
日志文件用于记录linux系统的各种运行信息的文件,相当于linux主机的日记,不同的日志文件记载了不同类型的信息,如Linux内核消息、用户登录事件、程序错误等。日志文件对于诊断和解决问题很有帮助,因为linux运行的程序通常把系统的消息和错误写入对应的日志文件,这样系统可以有据可查, 此外,当主机遭受攻击时,日志文件还可以帮助寻找攻击者留下的痕迹。
几种日志管理工具的介绍
在 Linux 系统中,日志管理主要由 rsyslog
/syslog
或 systemd-journald
负责,具体取决于系统配置和发行版。以下是判断系统使用哪种日志管理工具的方法:
方法 | systemd-journald | rsyslog /syslog |
---|
检查服务状态 | systemctl status systemd-journald | systemctl status rsyslog |
日志存储位置 | /var/log/journal/ (二进制) | /var/log/messages 或 /var/log/syslog (文本) |
查看日志命令 | journalctl | cat /var/log/syslog |
配置文件 | /etc/systemd/journald.conf | /etc/rsyslog.conf |
注:存在系统同时存在两者的情况。使用“systemctl status systemd-journald”或“systemctl status rsyslog”命令查看服务状态之后,按字母"q"可以退出查看状态回到命令行模式。
区别
特性 | systemd-journald | rsyslog / syslog |
---|
所属体系 | 由 systemd 提供(现代 Linux 默认) | 传统日志系统(syslog 是基础,rsyslog 是增强版) |
日志格式 | 二进制(不可直接编辑) | 纯文本(可直接用 cat /grep 查看) |
存储位置 | /var/log/journal/ (持久化)或内存(临时) | /var/log/syslog 、/var/log/messages 等 |
日志查看工具 | journalctl | cat 、tail 、grep 等文本工具 |
结构化数据 | 支持元数据(如进程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 | 日志来源(如 journal 、syslog 、kernel )。 |
_TRANSPORT(日志来源)字段解释:
来源类型 | 说明 | 典型日志示例 |
---|
journal | 由应用程序直接通过 sd-journal API 写入 journald (结构化日志)。 | 现代服务(如 systemd 管理的服务)通过此方式记录日志。 |
syslog | 通过传统的 syslog 协议接收的日志(如 rsyslog 转发或旧版应用)。 | 旧版应用(如 cron 、postfix )或未适配 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 | 仅查看内核日志(等效于 dmesg ) | journalctl -k |
7. 输出格式控制
命令 | 说明 | 示例 |
---|
journalctl -o json | JSON 格式输出(适合脚本处理) | journalctl -o json |
journalctl -o json-pretty | 格式化 JSON 输出 | journalctl -o json-pretty |
journalctl -o verbose | 显示所有元数据字段 | journalctl -o verbose |
journalctl --no-pager | 直接输出到终端(不分页) | journalctl --no-pager |