Linux运维进阶技巧-日志排查分析

TOC

日志查看技巧

1.全量查看日志:cat

我们可以通过cat命令来全量查看日志,但是当日志量很大的情况下我们都不会这样做。所以我们一般都是在查看全量日志的同时配合grepawksed这三个工具来使用,作用是过滤查看error日志或者关键信息的日志内容。
【示例】过滤日志文件中的ERROR日志

cat test.log |grep ERROR
# 也可以直接使用grep命令
grep ERROR test.log

2.配合less和more

所有的读取文本内容的命令都可以配合lessmore来分量读取文本里面的内容。如下所示:

# 配合less使用
cat test.log |less
# 配合more使用
cat test.log |more

less命令:按↑ 和 ↓快捷键来一行一行翻取文本内容,q快捷键退出阅读状态。
more命令:按Enter快捷键来一页页翻取文本内容,q快捷键退出阅读状态。

3.tail命令

tail命令是我们最常用的日志查看命令工具,主要用于从文本末尾开始读取内容,因为日志文件最新的内容都在最后,所以tail常用于日志文件的读取作用。
tail命令不加参数默认是读取文件最后10行内容,如下所示:
【示例1】查看文件末尾内容

tail test.log

我们可以通过-n 行数或者-行数参数来选择查看文件末尾多少行内容,如下所示:
【示例2】查看文件末尾20行内容

tail -n 20 test.log
# 或者以下方式
tail -20 test.log

☆以下方式是我们最常用的方式,就是实时查看日志内容,当日志文件内容更新,也会一直持续更新内容,方便我们在开发排查问题中,实时查看日志跟进查找问题。如下所示:
【示例2】实时查看文件内容

tail -f test.log

4.head命令

head命令跟tail命令的作用相反,head命令的作用就是从开头查看文件内容。
head命令不加参数跟tail一样默认是读取文件10行内容,只不过是开头的10行内容,如下所示:
【示例1】查看文件开头内容

head test.log

同样的head命令可以通过-n 行数或者-行数参数来选择查看文件开头多少行内容,如下所示:
【示例2】查看文件开头20行内容

head -n 20 test.log
# 或者以下方式
head -20 test.log

温馨提示:因为日志文件通常最新内容都在末尾更新,head命令是查看开头内容,所示就没有实时查看文件开头内容的选项,感觉也没有必要。

系统日志

一般Linux系统级别的日志都放在/var/log目录下,我们可以根据一些系统级别的日志解决一些问题。

系统常用日志:

日志文件 说明
/var/log/messages 记录系统启动、设备驱动、守护进程、系统服务等通用日志,是系统最重要的综合日志之一(CentOS/RHEL 常见)。
/var/log/syslog 与 /var/log/messages 类似,但在 Debian/Ubuntu 系中使用,记录系统级通用信息与错误。
/var/log/dmesg 记录系统启动时内核检测硬件的相关信息(由 dmesg 命令输出)。对硬件故障分析很有用。
/var/log/boot.log 系统启动过程中服务启动的详细信息。
/var/log/auth.log 同上,在 Debian/Ubuntu 系使用,记录认证和授权相关操作。
/var/log/faillog 记录失败登录尝试的信息,可用 faillog -a 查看。
/var/log/lastlog 记录每个用户最近一次登录信息,可用 lastlog 命令查看。
/var/log/btmp 记录登录失败的尝试,可用 lastb 命令查看。
/var/log/wtmp 记录所有用户登录、登出信息,可用 last 命令查看。
/var/log/utmp 记录当前已登录的用户信息,可通过 who 或 w 命令查看。

systemd管理服务日志

在我们使用systemd来对服务进行管理的时候我们可以通过systemctl status 服务名来获取服务的状态和一些日志,但是日志记录量有限,这个时候我们需要使journalctl来查看管理服务的相关日志。
journalctl是systemd的日志查看命令,用来读取由systemd-journald服务维护的二进制日志文件,它整合了系统启动日志、内核日志、服务日志、用户会话日志等。

systemd日志位置(默认):/var/log/journal
我们需要查看相关日志,如下所示:

# 查看所有管理服务的日志
journalctl -xe
# 查看指定服务的日志
journalctl -u 服务名

我们还可以其他方式查看,如下所示:
【示例1】实时跟踪日志

journalctl -f

【示例2】选取日志时间进行查看

journalctl --since "2025-10-13 09:00" --until "2025-10-13 11:00"

系统日志清理

我们可以通过journalctl --disk-usage来查看系统日志占用的空间,如下所示:

root@ihavetwocats:~# journalctl --disk-usage
Archived and active journals take up 2.0G in the file system.

上面可以看到系统日志占用了2.0G大小,我们可以通过以下方式进行清理。
【示例1】通过选择保留日志的时间

journalctl --vacuum-time=7d

可改为1month、2weeks、12h 等时间单位。

【示例2】通过保留日志文件的大小

journalctl --vacuum-size=1G

可改为500M、2G 等单位。

★日志查看神器:multitail

multitail是一个非常实用的Linux日志监控工具,可以在 同一个终端窗口中同时查看多个文件(通常是日志文件),并支持高亮、过滤、合并显示、动态刷新等功能。相比tail -f,它的功能更强大且更适合实时监控多个日志源。

作为Linux外部的命令工具,可能需要安装,安装方法如下:
Debian / Ubuntu

apt -y install multitail

RedHat / CentOS

yum -y install multitail

当我们需要同时查看多个日志文件的时候文件,我们后面只需要跟上多个日志文件名就行。
【示例】查看多个日志文件

multitail test1.log test2.log

查看结果会发现两个日志文件内容呈上下两块分开显示,如下图所示:
linux-advanced.017

我们可以通过-s选项自定义窗口的布局,按照每行多少个窗口的形式。
【示例】设置窗口每行2个窗口展示

multitail -s 2 test1.log test2.log

查看结果因为只有两个日志文件窗口,所以窗口并排展示,如下图所示:
linux-advanced.018

我们还可以通过-e选项过滤日志文件的内容来显示,相当于配合grep命令。
【示例】分开过滤两个日志文件的显示内容

multitail -s 2 -e 'start' test1.log -e 'running' test2.log

通过过滤我们一个文件只显示start相关内容,一个只显示running相关内容,如下图所示:
linux-advanced.019

还有其他很多好用的用法,如下所示:
【示例1】动态刷新指定命令的输出

multitail -l "journalctl -f"

温馨提示:该选项监控的是命令输出,而不是文件。

【示例2】合并显示多个文件内容

multitail -I test1.log -I test2.log

multitail常用交互快捷键

快捷键 功能
q 退出 multitail
b 暂停/恢复输出
n 切换到下一个窗口
p 切换到上一个窗口
/ 搜索文本
Ctrl + R 刷新显示
↑ / ↓ 滚动查看历史内容
+ / - 调整窗口高度