Linux 系统拥有十分强大且灵活的日志系统,用于保存几乎所有的操作记录和服务运行状态,并且按照“报错”“警告”“提示”和“其他”等标注进行了分类。运维管理员可以根据所需的信息进行检索,快速找出想要的信息,因此对于了解系统运行状态有着不错的帮助作用。
在 RHEL 8 系统中,默认的日志服务程序是 rsyslog。可以将 rsyslog 理解成之前的 syslogd服务的增强版本,它更加注重日志的安全性和性能指标。为了便于日后的检索,不同的日志信息会被写入到不同的文件中。在 Linux 系统中,常见的日志文件如表所示。
文件路径 | 作用 |
---|---|
/var/log/boot.log | 系统开机自检事件及引导过程等信息 |
/var/log/lastlog | 用户登录成功时间、终端名称及 IP 地址等信息 |
/var/log/btmp | 记录登录失败的时间、终端名称及 IP 地址等信息 |
/var/log/messages | 系统及各个服务的运行和报错信息 |
/var/log/secure | 系统安全相关的信息 |
/var/log/wtmp | 系统启动与关机等相关信息 |
在日常工作中,/var/log/message 这个综合性的文件用得最多。在处理 Linux 系统中出现的各种故障时,一般是最先发现故障的症状,而找到故障的原因则一定离不开日志信息的帮忙。
从理论上讲,日志文件分为下面 3 种类型:
- 系统日志:主要记录系统的运行情况和内核信息。
- 用户日志:主要记录用户的访问信息,包含用户名、终端名称、登入及退出时间、来源 IP 地址和执行过的操作等。
- 程序日志:稍微大一些的服务一般都会保存一份与其同名的日志文件,里面记录着服务运行过程中各种事件的信息;每个服务程序都有自己独立的日志文件,且格式相差较大。
每个稍微大一些的服务都有自己独立的日志文件,为了让用户在检索信息时不至于特别麻烦,journalctl 命令应运而生。journalctl 命令用于检索和管理系统日志信息,英文全称为“journal control”,语法格式为“journalctl 参数”。它可以根据事件、类型、服务名称等信息进行信息检索,从而大大提高了日常排错的效率。journalctl 命令的常见参数如表所示。
参数 | 作用 |
---|---|
-k | 内核日志 |
-b | 启动日志 |
-u | 指定服务 |
-n | 指定条数 |
-p | 指定类型 |
-f | 实时刷新(追踪日志) |
--since | 指定时间 |
--disk-usage | 占用空间 |
首先查看系统中最后 5 条日志信息:
[root@serverA ~]# journalctl -n 5 //查看系统中最后5条日志信息
还可以使用 -f 参数实时刷新日志的最新内容(这与 tail -f /var/log/message 命令的效果相同):
[root@serverA ~]# journalctl -f //实时刷新日志的最新内容
在 rsyslog 服务程序中,日志根据重要程度被分为 9 个等级,如表所示。这样的好处是可以直击最重要的信息,而不用担心会被海啸般的输出内容所淹没。备用日后工作中进行查阅。
日至等级 | 说明 |
---|---|
emerg | 系统出现严重故障,比如内核崩溃 |
alert | 应立即修复的故障,比如数据库损坏 |
crit | 危险性较高的故障,比如硬盘损坏导致程序运行失败 |
err | 危险性一般的故障,比如某个服务启动或运行失败 |
warning | 警告信息,比如某个服务参数或功能出错 |
notice | 不严重的一般故障,只是需要抽空处理的情况 |
info | 通用性消息,用于提示一些有用的信息 |
debug | 调试程序所产生的信息 |
none | 没有优先级,不进行日志记录 |
如果只想看系统中较高级别的报错信息,可以在 journalctl 命令中用 -p 参数进行指定:
[root@serverA ~]# journalctl -p crit //查看更高级别的报错信息
还可以用--since 参数按照今日(today)、近 N 小时(hour)、指定时间范围的格式进行检索,找出最近的日志数据。
[root@serverA ~]# journalctl --since today //仅查询今日的日志信息:
[root@serverA ~]# journalctl --since "-1 hour" //仅查询最近1小时的日志信息
[root@serverA ~]# journalctl --since "12:00" --until "14:00" //仅查询 12 点整到 14 点整的日志信息
[root@serverA ~]# journalctl --since "2022-01-01" --until "2022-12-12"
//仅查询从 2020 年 7 月 1 日至 2020 年 8 月 1 日的日志信息
[root@serverA ~]# journalctl -u sshd //查询SSH服务的日志信息