如何读取上一个会话的 dmesg? (dmesg.0)

如何读取上一个会话的 dmesg? (dmesg.0)

dmesg 是读取内容的命令/var/log/dmesg。相比之下,好的一点less /var/log/dmesg是我可以使用 -T 标志来进行人类可读的时间输出。

现在我想看看/var/log/dmesg.0我的计算机是如何崩溃的。该文件包含先前会话的日志。但我想使用 dmesg 命令中的 -T 标志。或者类似的东西。

知道怎么做吗?

我不介意图形工具,但最好的是 cli 解决方案。

答案1

虽然对于OP来说有点晚了...

我使用 Fedora,但如果您的系统使用 Fedora,那么您可以通过以下方式journalctl轻松获取先前关闭/崩溃(以某种格式)的内核消息(dmesg 日志) 。dmesg -T

选项:

  • -k(dmesg)
  • -b <引导号>(0、-1、-2 等之前重新启动了多少次)
  • -o 短精确 (dmesg -T)
  • -p优先事项按优先级输出过滤(4 过滤掉通知和信息)。

注意:还有一个-o shortand-o short-iso分别给出日期和 iso 格式的日期时间。

命令:

  • 所有启动周期:journalctl -o short-precise -k -b all
  • 当前启动:journalctl -o short-precise -k
  • 最后一次启动:journalctl -o short-precise -k -b -1
  • 之前的两双靴子:journalctl -o short-precise -k -b -2
  • 等等

示例输出:

Feb 18 21:41:26.917400 localhost.localdomain kernel: usb 2-4: USB disconnect, device number 12
Feb 18 21:41:26.917678 localhost.localdomain kernel: usb 2-4.1: USB disconnect, device number 13
Feb 18 21:41:27.246264 localhost.localdomain kernel: usb 2-4: new high-speed USB device number 22 using xhci_hcd
Feb 18 21:41:27.419395 localhost.localdomain kernel: usb 2-4: New USB device found, idVendor=05e3, idProduct=0610
Feb 18 21:41:27.419581 localhost.localdomain kernel: usb 2-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Feb 18 21:41:27.419739 localhost.localdomain kernel: usb 2-4: Product: USB2.0 Hub
Feb 18 21:41:27.419903 localhost.localdomain kernel: usb 2-4: Manufacturer: GenesysLogic

可以回顾的靴子数量可以通过以下方式查看。

  • journalctl --list-boot

的输出journalctl --list-boot如下所示。

-6 cc4333602fbd4bbabb0df2df9dd1f0d4 Sun 2016-11-13 08:32:58 JST—Thu 2016-11-17 07:53:59 JST
-5 85dc0d63e6a14b1b9a72424439f2bab4 Fri 2016-11-18 22:46:28 JST—Sat 2016-12-24 02:38:18 JST
-4 8abb8267e06b4c26a2466562f3422394 Sat 2016-12-24 08:10:28 JST—Sun 2017-02-12 12:31:20 JST
-3 a040f5e79a754b2a9055ac2598d430e8 Sun 2017-02-12 12:31:36 JST—Sat 2017-02-18 21:31:04 JST
-2 6c29e3b6f6a14f549f06749f9710e1f2 Sat 2017-02-18 21:31:15 JST—Sat 2017-02-18 22:36:08 JST
-1 42fd465eacd345f7b595069c7a5a14d0 Sat 2017-02-18 22:51:22 JST—Sat 2017-02-18 23:08:30 JST  
 0 26ea10b064ce4559808509dc7f162f07 Sat 2017-02-18 23:09:25 JST—Sun 2017-02-19 00:57:35 JST

答案2

为了澄清一个根本性的误解,dmesg不阅读/var/log/dmesg。它直接从内核环形缓冲区读取并为您提供最近的 N 条消息。在引导过程即将结束时,dmesg调用将引导消息写入/var/log/dmesg(以通常的方式轮换该文件的旧版本)。

一旦您运行了 syslog(syslogdrsyslogdsyslog-ng等),它就会从内核缓冲区读取数据并写入文件,例如/var/log/kern.log. (这适用于 Debian;其他系统会有所不同)。假设您的系统在崩溃之前能够写入磁盘并刷新磁盘缓冲区,那么您将在其中找到内核垂死的尖叫声。

在我的 Debian 系统上,该/var/log/kern.log文件包含人类可读的时间戳。

答案3

在 Debian 中,dmesg日志存储为:

  • /var/log/dmesg(实时且未压缩)
  • /var/log/dmesg.0(最后一次会话且未压缩)
  • /var/log/dmesg.1.gz(倒数第二个并压缩)
  • /var/log/dmesg.2.gz(倒数倒数前面和压缩)
  • /var/log/dmesg.3.gz(倒数第四个并已压缩)
  • /var/log/dmesg.4.gz(倒数第五个并已压缩)

如果您有适当的权限,则可以使用cat,more或读取它们less(对于普通文件)和zcat,zmorezless对于压缩文件

答案4

对于 alpinelinux,

echo 'previous_dmesg=yes' >> /etc/conf.d/bootmisc

mv /var/log/dmesg /var/log/dmesg.old在 bootmisc 中执行。

相关内容