一、日志分析概述:启动日志到底是什么?

各位好,我是老赵。做运维十几年,我见过太多工程师一遇到系统启动失败就手足无措。其实,启动日志就是系统留给我们的「黑匣子」。今天咱们就来聊聊这个黑匣子到底装了什么。

1.1 什么是启动日志?

启动日志,说白了就是操作系统从按下电源键到完全就绪这段时间里,内核、服务、驱动打印出来的所有记录。我习惯把它比作「系统的出生证明」——记录了每个组件什么时候醒来、什么时候报错、什么时候罢工。

举个例子,你开机发现网卡没起来。启动日志里会清清楚楚写着:eth0: link not ready。这就是线索。

核心定义:启动日志是系统引导阶段(Boot Phase)产生的时序化事件记录,包含硬件探测、内核初始化、服务启动、文件系统挂载等关键步骤的成败信息。

1.2 日志分析的价值——为什么我劝你别跳过这一步

我记得刚入行那会儿,遇到服务器起不来,第一反应就是重装系统。后来被师傅骂了一顿:「日志就在那儿,你看都不看?」从那以后,我养成了先看日志的习惯。

启动日志分析的价值,我总结为三点:

  • 故障定位快——系统起不来,日志里通常有明确的错误行。比如 Failed to mount /data,直接告诉你挂载点有问题。
  • 性能瓶颈早发现——某个服务启动花了30秒,日志里时间戳一对比就暴露了。我在项目中遇到过,一个 systemd-networkd-wait-online.service 硬生生把启动时间拖了45秒。
  • 安全事件溯源——有人改了内核参数?日志里 kernel: command line 那一行会记录所有启动参数变更。

我的经验:启动日志是「第一现场」证据。系统跑起来之后,很多临时错误会被覆盖。所以,系统起不来的时候,第一时间去翻启动日志,别急着重启。

1.3 常见日志格式——三种主流格式,你得会看

目前主流的 Linux 发行版,启动日志主要有三种格式。我一个个说。

1.3.1 Syslog 格式(传统派)

Syslog 是老牌日志协议,格式固定。你打开 /var/log/messages 或 /var/log/syslog,看到的每一行基本长这样:

Mar 15 10:23:45 webserver kernel: [    0.000000] Linux version 5.10.0-28-amd64 (debian-kernel@lists.debian.org)
Mar 15 10:23:45 webserver systemd[1]: Starting Journal Service...
Mar 15 10:23:46 webserver sshd[1234]: Server listening on 0.0.0.0 port 22.

格式拆解一下:

字段 含义 示例
时间戳 月 日 时:分:秒 Mar 15 10:23:45
主机名 产生日志的机器名 webserver
进程/服务名 产生日志的程序 kernel, systemd, sshd
PID 进程ID(方括号内) [1], [1234]
消息体 具体日志内容 Server listening on 0.0.0.0 port 22

注意:Syslog 格式的时间戳不带年份,跨年日志容易混淆。我曾经排查过一个跨年故障,日志里全是 Dec 和 Jan,差点搞错顺序。建议用 journalctl 配合 --since 参数来避免这个问题。

1.3.2 Journald 格式(现代派)

Systemd 时代,日志格式升级了。Journald 不再是一行行的文本,而是结构化数据。你用 journalctl 查看时,默认输出是这样的:

-- Logs begin at Mon 2025-03-15 10:22:30 CST, end at Mon 2025-03-15 11:00:00 CST. --
Mar 15 10:23:45 webserver systemd[1]: Starting Journal Service...
Mar 15 10:23:46 webserver sshd[1234]: Accepted publickey for root from 192.168.1.100 port 54321 ssh2: RSA SHA256:xxxx

但 Journald 真正的威力在结构化字段里。用 journalctl -o json-pretty 就能看到:

{
  "__CURSOR" : "s=abc123;...",
  "__REALTIME_TIMESTAMP" : "1742549025000000",
  "__MONOTONIC_TIMESTAMP" : "1234567890",
  "_BOOT_ID" : "a1b2c3d4e5f6...",
  "MESSAGE" : "Starting Journal Service...",
  "PRIORITY" : "6",
  "SYSLOG_FACILITY" : "3",
  "_PID" : "1",
  "_COMM" : "systemd",
  "_EXE" : "/usr/lib/systemd/systemd",
  "_CMDLINE" : "/sbin/init splash",
  "_SYSTEMD_CGROUP" : "/init.scope",
  "_SOURCE_REALTIME_TIMESTAMP" : "1742549025000000"
}

看到了吗?每个字段都是结构化的。我最常用的是 _BOOT_ID 字段——它能区分本次启动和上次启动的日志。你想想看,系统重启后,日志混在一起怎么办?用 journalctl -b -1 只看上一次启动的日志,这就是结构化带来的便利。

1.3.3 文本日志(传统派,但还在用)

有些老系统或者嵌入式设备,日志就是纯文本文件。比如 /var/log/boot.log,里面记录的是系统启动时每个服务的启动状态:

[  OK  ] Started Network Manager.
[  OK  ] Started SSH Server.
[FAILED] Failed to start MySQL Server.
See 'systemctl status mysql.service' for details.

这种格式最直观,但信息量少。我一般用它做快速筛查——看到 [FAILED] 就顺着去查 Journald 的详细日志。

1.4 三种格式对比——什么时候用哪个?

对比维度 Syslog Journald 文本日志
存储方式 纯文本文件 二进制结构化 纯文本文件
查询效率 低(grep 逐行扫描) 高(索引字段) 低(grep 逐行扫描)
跨启动区分 需手动标记 内置 _BOOT_ID 需手动标记
元数据丰富度 低(仅时间、主机、进程) 高(PID、UID、CGroup、命令行等) 极低(仅文本)
适用场景 传统 SysVinit 系统 现代 Systemd 系统 嵌入式、最小化系统

我的建议:如果你还在用 Syslog,尽快迁移到 Journald。结构化日志带来的查询效率提升,绝对值回票价。我曾经在 500 台服务器集群里排查一个启动故障,用 Journald 的 _BOOT_ID 字段 5 分钟就锁定了问题批次,换成 Syslog 至少半小时。

1.5 启动日志知识体系总览

下面这张图,是我自己梳理的启动日志分析知识框架。你可以把它当作整个课程的地图。

启动日志分析知识体系 启动日志分析知识体系 启动日志分析 日志格式 Syslog Journald 文本日志 分析价值 故障定位 性能瓶颈发现 安全事件溯源 核心概念 引导阶段 时序化事件 结构化字段 核心原则:先看格式,再定工具,最后定位问题 不同格式对应不同的查询和分析方法,选对工具效率翻倍

嗯,这张图把启动日志分析拆成了三个维度:格式、价值和概念。后面的课程,我们会沿着这个框架一步步深入。你先把今天的内容消化掉,搞清楚日志长什么样、为什么重要,后面学起来就顺了。

本章小结:

  • 启动日志是系统引导阶段的时序化事件记录
  • 日志分析的价值在于故障定位、性能发现、安全溯源
  • 三种主流格式:Syslog(传统文本)、Journald(结构化)、文本日志(简易)
  • 现代系统优先用 Journald,查询效率远高于 Syslog