Linux 日志与故障排查完全指南


Linux 日志与故障排查完全指南

基础介绍

日志(Logs)是 Linux 系统中记录事件、错误和系统状态的文件。它们对于监控系统健康状况、诊断问题和进行安全审计至关重要。良好的日志管理和故障排查能力是每个 Linux 系统管理员必备的技能。

工作原理简图:

1
[应用程序/服务] --> [日志记录工具 (rsyslog, systemd-journald)] --> [日志文件]

在 Linux 系统中,各种应用程序和服务会将重要的事件和错误信息写入到日志文件中。这些日志文件通常位于 /var/log/ 目录下。常见的日志记录工具包括 rsyslogsystemd-journald。通过分析这些日志文件,可以了解系统的运行状况,及时发现并解决潜在问题。

常用命令

命令 参数 说明
tail -f, -n <行数> 显示文件末尾的内容。-f 参数可以实时追踪文件更新。-n 参数指定显示的行数。
head -n <行数> 显示文件头的内容。-n 参数指定显示的行数。
cat 连接文件并打印到标准输出。常用于查看整个日志文件。
grep -i, -r, -n, -v, -A, -B 在文件中搜索匹配指定模式的行。-i 忽略大小写,-r 递归搜索目录,-n 显示行号,-v 反向匹配,-A 显示匹配行之后的内容,-B 显示匹配行之前的内容。
less 允许你前后滚动浏览文件,并且可以搜索。这对于大型日志文件非常有用。
journalctl -u <单元>, -since, -until 用于查询 systemd-journald 收集的日志。-u 指定单元(服务)名称,-since 指定起始时间,-until 指定结束时间。
dmesg 显示内核环缓冲区的内容,包含内核启动信息和硬件相关的消息。
find -name, -mtime, -size 用于在文件系统中查找文件。-name 按名称查找,-mtime 按修改时间查找,-size 按大小查找。
awk {print $1} 一种文本处理工具,可以用于从日志文件中提取特定字段。
sed s/old/new/g 一种流编辑器,可以用于替换日志文件中的文本。

⚠️ 高危操作警告: 直接使用 > 重定向覆盖现有日志文件可能导致数据丢失。建议使用 >> 追加写入。

命令使用频率:

  • tail:★★★★
  • grep:★★★★
  • journalctl:★★★☆
  • less:★★★☆
  • cat:★★☆☆
  • dmesg:★★☆☆

示例代码

案例 1: 查找 Nginx 错误日志

假设你需要查找 Nginx 错误日志文件中包含 “error” 关键字的行。

1
2
3
4
5
6
7
8
# 使用 tail 命令实时追踪 Nginx 错误日志文件
tail -f /var/log/nginx/error.log

# 使用 grep 命令查找包含 "error" 关键字的行
grep "error" /var/log/nginx/error.log

# 组合使用 tail 和 grep 命令,实时追踪并过滤包含 "error" 关键字的行
tail -f /var/log/nginx/error.log | grep "error"

预期输出示例:

1
2023/10/27 10:00:00 [error] 1234#0: *1 client stopped connection prematurely

步骤解释:

  1. tail -f /var/log/nginx/error.log: 实时显示 Nginx 错误日志文件的末尾内容。
  2. grep "error" /var/log/nginx/error.log: 在 Nginx 错误日志文件中搜索包含 “error” 关键字的行。
  3. tail -f /var/log/nginx/error.log | grep "error": 使用管道符 |tail 命令的输出传递给 grep 命令进行过滤。

案例 2: 使用 journalctl 查看特定服务的日志

假设你需要查看 nginx.service 服务的日志。

1
2
3
4
5
6
7
8
9
10
11
# 查看 nginx.service 服务的日志
journalctl -u nginx.service

# 查看 nginx.service 服务最近 1 小时的日志
journalctl -u nginx.service --since "1 hour ago"

# 查看 nginx.service 服务从指定日期开始的日志
journalctl -u nginx.service --since "2023-10-26"

# 实时追踪 nginx.service 服务的日志
journalctl -u nginx.service -f

预期输出示例:

1
2
Oct 27 09:00:00 your_hostname systemd[1]: Started Nginx Web Server.
Oct 27 09:00:01 your_hostname nginx[1234]: [notice] ...

步骤解释:

  1. journalctl -u nginx.service: 显示 nginx.service 单元的所有日志。
  2. journalctl -u nginx.service --since "1 hour ago": 显示 nginx.service 单元最近 1 小时的日志。
  3. journalctl -u nginx.service --since "2023-10-26": 显示 nginx.service 单元从 2023 年 10 月 26 日开始的日志。
  4. journalctl -u nginx.service -f: 实时显示 nginx.service 单元的日志。

案例 3:查找特定时间段内的日志

要查找特定时间段内的日志,可以使用 journalctl 命令结合 --since--until 参数。

1
2
# 查找从 2023-10-26 08:00:00 到 2023-10-27 09:00:00 之间的系统日志
journalctl --since "2023-10-26 08:00:00" --until "2023-10-27 09:00:00"

预期输出示例:

1
2
3
4
Oct 26 08:00:01 your_hostname systemd[1]: ...
Oct 26 08:00:02 your_hostname cron[1235]: ...
...
Oct 27 08:59:59 your_hostname systemd[1]: ...

步骤解释:

  1. journalctl --since "2023-10-26 08:00:00" --until "2023-10-27 09:00:00": 显示从 “2023-10-26 08:00:00” 到 “2023-10-27 09:00:00” 这段时间内的所有系统日志。

Metadata

  • Tags: Linux, 日志, 故障排查, rsyslog, systemd-journald, tail, grep, journalctl
  • Categories: 系统管理, 故障排查

文章作者: 达朵
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 达朵 !
  目录