DAY 03: 日志调查员

LinuxBeginner
立即练习

简介

今天是 LabEx 公司的第三天,凤凰项目(Project Phoenix)遭遇了重大危机!你来到办公室,发现 Sarah Chen 和开发团队正处于紧急状态。你昨天协助整理的应用程序在首次大规模测试阶段遇到了严重错误。

监控系统不断发出紧急警报,用户报告应用程序崩溃,部署流水线也陷入了停滞。Sarah 绝望地看向你——资深 DevOps 工程师请假了,而项目截止日期迫在眉睫。

「我们需要最优秀的调查员来处理这件事,」Sarah 把事故报告递给你,「你昨天整理文件时展现出的系统性方法正是我们现在所需要的。我们需要你用同样严谨的思维来解开这个谜团。」

你的任务是深入凤凰项目的服务器,分析日志和配置文件,找出这些故障的根本原因。你将使用高级 Linux 命令行工具来拼凑线索,并恢复你团队辛苦构建的应用程序的稳定性。凤凰项目的未来——甚至你在 TechNova 的职业生涯——都取决于你的侦探技能!

查看应用程序日志文件内容

作为调查员,你的第一步是检查凤凰项目的应用程序日志文件。该应用程序将日志写入 ~/project/logs/app.log。由于日志信息量巨大,你需要快速找到关键的错误信息,以了解你昨天协助整理的系统究竟出了什么问题。

任务

  • 过滤 ~/project/logs/app.log 文件,找出所有包含 ERROR 字样的行。
  • 将过滤后的行保存到一个名为 ~/project/error_report.txt 的新文件中。

要求

  • 必须使用命令行工具来搜索文件。
  • 搜索的输入文件是 ~/project/logs/app.log
  • 输出必须保存到 ~/project 目录下的 ~/project/error_report.txt 文件中。
  • 输出文件应仅包含包含 ERROR 字样的行。

提示

  • grep 命令非常适合在文本文件中搜索模式。
  • 要将命令的输出保存到文件,可以使用 > 重定向操作符。如果文件不存在,它会创建该文件;如果文件已存在,它会覆盖原有内容。

示例

成功过滤日志文件后,你的 ~/project/error_report.txt 文件应仅包含错误行:

$ cat ~/project/error_report.txt
[2023-10-26 10:00:03] ERROR: Failed to process payment transaction #12345.
[2023-10-26 10:00:05] ERROR: NullPointerException at com.innovatech.Billing.process(Billing.java:101).

该文件应恰好包含 2 行,每行都以时间戳开头并包含单词「ERROR」。

调查系统启动消息

应用程序错误可能是更深层次的硬件或内核级问题的征兆。查找此类问题的一个好地方是内核环形缓冲区(kernel ring buffer),其中包含了系统启动过程和驱动程序操作的消息。

任务

  • 检查系统的内核消息,查找任何与 failerror 相关的行。
  • 将这些发现保存到名为 ~/project/boot_issues.txt 的文件中。

要求

  • 必须使用 dmesg 命令查看内核消息。
  • failerror 的搜索应忽略大小写。
  • 结果必须保存到名为 ~/project/boot_issues.txt 的文件中。
  • 注意:你可能需要管理员权限(sudo)才能访问内核消息。

提示

  • dmesg 命令用于显示内核消息。你可以将其输出「管道传输」(pipe)给另一个命令进行过滤。
  • 管道操作符 | 将一个命令的输出发送到另一个命令的输入。
  • grep 命令的 -i 选项可以使搜索忽略大小写。
  • 要同时搜索多个模式(例如 failerror),可以使用 grep -E 'pattern1|pattern2'
  • 注意:如果遇到「Operation not permitted」错误,请尝试使用 sudo 运行命令以获取必要的权限。

示例

成功过滤内核消息后,你的 ~/project/boot_issues.txt 文件应包含相关的系统消息:

$ cat ~/project/boot_issues.txt
[    0.330755] acpi PNP0A03:00: fail to add MMCONFIG information, can't access extended PCI configuration space under this bridge.
[    1.026520] RAS: Correctable Errors collector initialized.
[   28.260800] kernel: [   10.123456] my-driver: probe of 0000:00:1f.0 failed with error -2

该文件应包含包含「fail」或「error」(忽略大小写)的内核消息,显示系统启动期间潜在的硬件或驱动程序问题。

检查 Web 服务器配置文件

没有发现严重的硬件问题。问题可能出在 Web 服务器配置上。让我们检查 Nginx 配置文件,看看它是如何设置的。有时,配置错误(例如工作进程数过少)会导致性能瓶颈,并在负载下导致应用程序故障。

任务

  • 搜索位于 ~/project/config/nginx.conf 的 Web 服务器配置文件。
  • 找到包含 worker_processes 指令的行。
  • 将此行追加到你在第一步中创建的 ~/project/error_report.txt 文件中。

要求

  • 输入文件是 ~/project/config/nginx.conf
  • 必须将结果追加~/project/error_report.txt,而不是覆盖它。

提示

  • 你可以再次使用 grep 完成此任务。
  • 要将输出追加到文件而不是覆盖,请使用 >> 操作符。

示例

worker_processes 行追加到现有的错误报告后,~/project/error_report.txt 文件现在应同时包含原始错误行和新的配置行:

$ cat ~/project/error_report.txt
[2023-10-26 10:00:03] ERROR: Failed to process payment transaction #12345.
[2023-10-26 10:00:05] ERROR: NullPointerException at com.innovatech.Billing.process(Billing.java:101).
worker_processes 4;

该文件总共应包含 3 行:2 行原始错误行加上 1 行包含「worker_processes 4;」的新行。

比较暂存环境与生产环境的配置文件

生产环境问题的常见来源是暂存环境(staging)和生产环境(production)之间的差异。某个功能可能在暂存环境中运行完美,但由于微小的配置差异而在生产环境中失败。让我们比较两个环境的应用程序配置文件,以找出差异。

任务

  • 比较暂存配置文件 ~/project/config/staging/app.conf 与生产配置文件 ~/project/config/production/app.conf
  • 将差异保存到一个名为 ~/project/config_diff.txt 的新文件中。

要求

  • 必须使用 diff 命令。
  • 显示差异的输出必须保存到 ~/project/config_diff.txt

提示

  • diff 命令专门用于逐行比较两个文件。
  • 基本语法是 diff file1 file2,它会显示为了使 file1 与 file2 完全相同需要进行的更改。
  • 文件的顺序很重要!diff A Bdiff B A 的输出结果不同。
  • 你可以像使用 grep 一样,将 diff 的输出重定向到文件。

示例

比较暂存和生产配置文件后,你的 ~/project/config_diff.txt 文件应显示两个环境之间的差异:

$ cat ~/project/config_diff.txt
1,5c1,5
< ## Staging Configuration
< database.url=jdbc:mysql://staging-db:3306/nexus
< api.key=staging_key_abc123
< feature.flag.new_dashboard=true
< timeout.ms=3000
---
> ## Production Configuration
> database.url=jdbc:mysql://prod-db:3306/nexus
> api.key=prod_key_xyz789
> feature.flag.new_dashboard=false
> timeout.ms=5000

diff 输出显示了为了使暂存配置文件与生产配置文件匹配,需要进行哪些更改。以 < 开头的行显示暂存文件中的内容,而以 > 开头的行显示生产文件中的内容。这揭示了生产环境与暂存环境相比,使用了不同的数据库 URL、API 密钥、功能标志和超时值。

验证服务器之间的目录一致性

配置差异是一个重要的线索!生产服务器似乎还缺少一些暂存服务器上存在的重要文件。这可能是由于部署失败导致的。让我们通过比较代表两个不同服务器文件结构的目录来模拟这种情况。

任务

  • 你有两个目录:/home/labex/project/server1_files(代表暂存服务器)和 /home/labex/project/server2_files(代表生产服务器)。
  • 比较这两个目录,找出哪些文件是 server1_files 独有的。
  • 将完整的比较输出保存到名为 /home/labex/project/missing_files.txt 的文件中。

要求

  • 必须使用 diff 命令比较这两个目录。
  • 输出必须保存到 /home/labex/project/missing_files.txt

提示

  • 如果提供目录路径而不是文件路径,diff 命令也可以比较目录。
  • 在比较目录时,使用 -r--recursive 选项是一个好习惯,因为它会递归比较目录中的所有文件。
  • diff 在目录上的输出格式将明确指出哪些文件「仅在」(Only in)特定目录中。
  • 和文件一样,比较目录时顺序也很重要。diff dir1 dir2 显示 dir1 中有但 dir2 中没有的内容,而 diff dir2 dir1 则显示相反的结果。

示例

比较两个服务器目录后,你的 /home/labex/project/missing_files.txt 文件应显示生产服务器中缺少哪些文件:

$ cat /home/labex/project/missing_files.txt
Only in /home/labex/project/server1_files: asset2.js

此输出表明 asset2.js 存在于第一个目录(server1_files,代表暂存服务器)中,但从第二个目录(server2_files,代表生产服务器)中丢失了。通过先比较暂存环境,后比较生产环境,我们可以轻松识别生产环境中缺失的文件,这可能解释了部分应用程序故障的原因。

总结

出色的侦探工作!你已经成功找出了凤凰项目严重故障的根本原因,并为 Sarah Chen 和开发团队提供了解决问题的可行情报。

通过系统性的调查,你已经掌握了核心的故障排除命令:

  • grep:用于过滤日志文件并提取关键错误信息。
  • dmesg:用于调查系统级硬件和内核问题。
  • diff:用于比较配置文件并识别环境之间的差异。
  • 命令管道和重定向:用于高效处理和记录你的发现。

你对日志分析的严谨方法使凤凰项目免于潜在的灾难性故障。开发团队现在有了明确的方向,可以修复你发现的配置不匹配和缺失的部署文件。

Sarah Chen 对你的调查能力印象深刻,她正推荐你担任安全职位。明天,你将扮演「堡垒守护者」(Fortress Guardian),保护凤凰项目的基础设施,使其免受未来威胁!

✨ 查看解决方案并练习✨ 查看解决方案并练习✨ 查看解决方案并练习✨ 查看解决方案并练习✨ 查看解决方案并练习