dmesg日志中加入时间戳

dmesg日志中加入时间戳

dmesg命令相关包

  • CentOS 7之前的版本的dmesg日志是没有时间戳的,原因是util-linux-ng版本太低,不具备日期显示功能
[root@centos6 ~]#rpm -qf /bin/dmesg
util-linux-ng-2.17.2-12.28.el6_9.2.x86_64

  • util-linux-2.20+才会有时间戳功能
[root@centos7 ~]#rpm -qf /bin/dmesg
util-linux-2.23.2-52.el7.x86_64

dmesg日志查看

dmesg查看的日志存放在 /var/log/dmesg

  • CentOS 6 dmesg信息,无时间戳
[root@centos6 ~]#dmesg |tail
ISO 9660 Extensions: Microsoft Joliet Level 3
ISO 9660 Extensions: RRIP_1991A
usb 2-2.1: USB disconnect, device number 4
usb 2-2.1: new full speed USB device number 5 using uhci_hcd
usb 2-2.1: New USB device found, idVendor=0e0f, idProduct=0008
usb 2-2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 2-2.1: Product: Virtual Bluetooth Adapter
usb 2-2.1: Manufacturer: VMware
usb 2-2.1: SerialNumber: 000650268328
usb 2-2.1: configuration #1 chosen from 1 choice
  • CentOS 7 dmesg信息,dmesg -T可以显示时间戳
[root@centos7 ~]#dmesg -T  |tail
[Fri Sep 21 00:55:32 2018] usb 2-2.1: SerialNumber: 000650268328
[Fri Sep 21 00:56:39 2018] ISO 9660 Extensions: Microsoft Joliet Level 3
[Fri Sep 21 00:56:39 2018] ISO 9660 Extensions: RRIP_1991A
[Fri Sep 21 09:43:28 2018] usb 2-2.1: USB disconnect, device number 12
[Fri Sep 21 09:43:28 2018] usb 2-2.1: new full-speed USB device number 13 using uhci_hcd
[Fri Sep 21 09:43:28 2018] usb 2-2.1: New USB device found, idVendor=0e0f, idProduct=0008
[Fri Sep 21 09:43:28 2018] usb 2-2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[Fri Sep 21 09:43:28 2018] usb 2-2.1: Product: Virtual Bluetooth Adapter
[Fri Sep 21 09:43:28 2018] usb 2-2.1: Manufacturer: VMware
[Fri Sep 21 09:43:28 2018] usb 2-2.1: SerialNumber: 000650268328

日志无时间戳的原因

  • 原因是/sys/module/printk/parameters/time为N即0,不开启状态

  • /sys/module/*包含所有编译的模块信息

这里有系统中所有模块的信息,不论这些模块是以内联(inlined)方式编译到内核映像文件(vmlinuz)中还是编译为外部模块(ko文件),都可能会出现在 /sys/module 中:

  • 编译为外部模块(ko文件)在加载后会出现对应的 /sys/module/<module_name>/, 并且在这个目录下会出现一些属性文件和属性目录来表示此外部模块的一些信息,如版本号、加载状态、所提供的驱动程序等;
  • 编译为内联方式的模块则只在当它有非0属性的模块参数时会出现对应的
    /sys/module/<module_name>, 这些模块的可用参数会出现在
    /sys/modules/<modname>/parameters/<param_name>
  • /sys/module/printk/parameters/time 这个可读写参数控制着内联模块 printk 在打印内核消息时是否加上时间前缀;所有内联模块的参数也可以由 <module_name>.<param_name>=<value> 的形式写在内核启动参数上
  • 如启动内核时加上参数 printk.time=1 与 向 /sys/module/printk/parameters/time 写入1的效果相同;没有非0属性参数的内联模块不会出现于此。

CentOS 6的printk.time值为N

[root@centos6 ~]#cat /sys/module/printk/parameters/time
N

CentOS 7的printk.time值为Y

[root@centos7 ~]#cat /sys/module/printk/parameters/time 
Y

解决方法一:通过新增监控日志kern来解决

1. 修改/sys/module/printk/parameters/time参数

  • 使其开始为今后日志添加时间戳,但是重启后会失效
  • 可以使用dmesg查询
[root@centos6 ~]#echo 1 >/sys/module/printk/parameters/time
[root@centos6 ~]#cat  /sys/module/printk/parameters/time
Y

2. 在监控日志配置/etc/rsyslog.conf中,添加监控kern的信息,并重启rsyslog服务

  • 从服务重启后开始生效,kern日志都记录在/var/log/kern.log
  • 但重启后用dmesg查看的日志依然没有时间戳;因为/sys/下的目录存放的是系统内存的信息,重启会失效;
  • 同时,/var/log/kern.log中的日志的时间格式是人类易读的
[root@centos6 ~]#sed -i '/local7/a\kern.*       /var/log/kern.log' /etc/rsyslog.conf
[root@centos6 /]#grep kern.log  /etc/rsyslog.conf  
kern.*          /var/log/kern.log
[root@centos6 /]#service rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
[root@centos6 /]#

  • 查询日志
[root@centos6 ~]#cat /var/log/kern.log 
Sep  1 03:29:09 centos6 kernel: imklog 5.8.10, log source = /proc/kmsg started.
[root@centos6 ~]#dmesg |tail
usb 2-2.1: USB disconnect, device number 4
usb 2-2.1: new full speed USB device number 5 using uhci_hcd
usb 2-2.1: New USB device found, idVendor=0e0f, idProduct=0008
usb 2-2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 2-2.1: Product: Virtual Bluetooth Adapter
usb 2-2.1: Manufacturer: VMware
usb 2-2.1: SerialNumber: 000650268328
usb 2-2.1: configuration #1 chosen from 1 choice
[ 1065.215969] ISO 9660 Extensions: Microsoft Joliet Level 3
[ 1065.218372] ISO 9660 Extensions: RRIP_1991A

3. 重启后查询日志

  • dmesg日志,再次无时间戳
[root@centos6 ~]#dmesg |tail -n 5
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
e1000: eth1 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
type=1305 audit(1535743941.130:3): audit_pid=1510 old=0 auid=4294967295 ses=4294967295 res=1
eth0: no IPv6 routers present
eth1: no IPv6 routers present
  • /var/log/kern.log日志,依然有时间
[root@centos6 ~]#tail -n 5 /var/log/kern.log 
Sep  1 03:32:21 centos6 kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Sep  1 03:32:21 centos6 kernel: e1000: eth1 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Sep  1 03:32:21 centos6 kernel: type=1305 audit(1535743941.130:3): audit_pid=1510 old=0 auid=4294967295 ses=4294967295 res=1
Sep  1 03:32:23 centos6 kernel: eth0: no IPv6 routers present
Sep  1 03:32:27 centos6 kernel: eth1: no IPv6 routers present

解决方法二:修改内核参数

1. 修改/sys/module/printk/parameters/time为1,此时打印日志时间生效,但是重启后会失效

  • echo 1 >/sys/module/printk/parameters/time
[root@centos6 ~]#echo 1 >/sys/module/printk/parameters/time
[root@centos6 ~]#cat  /sys/module/printk/parameters/time
Y

2. 修改启动时的内核参数/boot/grub/grub.conf

  • grub.conf所需要修改的行 sed -rn '/^[^#].*kernel(.*)/p' /boot/grub/grub.conf
[root@centos6 ~]#sed -rn '/^[^#].*kernel(.*)/p' /boot/grub/grub.conf 
    kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet

3. 在最后添加 prinkt.time=1,备份原配置; 在内核启动时添加参数,这样重启就不会失效了

  • sed -r -i.bak 's@(^[^#].*kernel.*)$@\1 printk.time=1@' /boot/grub/grub.conf
[root@centos6 ~]#sed -r -i.bak 's@(^[^#].*kernel.*)$@\1 printk.time=1@' /boot/grub/grub.conf
  • sed -rn '/^[^#].*kernel(.*)/p' /boot/grub/grub.conf 查看修改后配置
[root@centos6 ~]#sed -rn '/^[^#].*kernel(.*)/p' /boot/grub/grub.conf
    kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet printk.time=1

4. 查看dmesg信息

  • 已经打上了时按戳,但不是人类可读的形式,这个数值是值开启到日志发生时所经过的时间,单位是秒,需要做换算
[root@centos6 /]#dmesg |tail
usb 2-2.1: USB disconnect, device number 4
usb 2-2.1: new full speed USB device number 5 using uhci_hcd
usb 2-2.1: New USB device found, idVendor=0e0f, idProduct=0008
usb 2-2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 2-2.1: Product: Virtual Bluetooth Adapter
usb 2-2.1: Manufacturer: VMware
usb 2-2.1: SerialNumber: 000650268328
usb 2-2.1: configuration #1 chosen from 1 choice
[ 1140.744469] ISO 9660 Extensions: Microsoft Joliet Level 3
[ 1140.746766] ISO 9660 Extensions: RRIP_1991A
[root@centos6 /]#

两种方法相同点

  1. 都能实现,配置完成后立刻生效,记录配置完成后的相关带时间戳的日志信息
  2. 都能实现重启后依然显示带时间戳的内核日志信息
  3. 对配置前的日志都不能再加上时间戳了,因为之前的功能并为开启;
  4. dmesg显示的时间均为人类不易读的格式,需要转换

两种方法不同点

  1. 方法一添加了kern日志,dmesg重启后不带时间戳,同时,kern日志不能直接用 dmesg查看
  2. 方法二修改了内核参数,内核信息都可以从dmesg中查看,重启依然有效
  3. kern日志的时间戳是人类易读的方式,dmesg时间戳不易读

时间戳转换脚本

还有点小BUG,过滤不全,仅供参考

  • 脚本
#!/bin/bash
# /root/bin/dmesg_with_human_timestamps.sh

dmesg | while read msg; do

    # 过滤无时间戳的日志条目,无需转换
    if [ `echo "$msg" |cut -c 1` !=  "[" ] ;then
        echo $msg
        continue
    fi
    
    # 获取每条日志的非可读秒数
    no_human_timestamps=`echo $msg |grep -E  -o "\b[0-9]+\.[0-9]{6}\b"`
    
    # 获取每条日志的从1970-01-01开始到日志记录时的秒数
    real=`echo "$(date +%s)-$(awk '{print $1}' /proc/uptime)+$no_human_timestamps" |bc`
    
    # 人类可读格式
    human_timestamps=`date -d @$real`
    
    # 转换并打印
    echo "$msg" | sed -rn 's@'"$no_human_timestamps"'@'"$human_timestamps"'@p' 
done
  • 设置dmesg别名
[root@app6 bin]#echo 'alias dmesg="/root/bin/dmesg_with_human_timestamps.sh"' >> ~/.bashrc
  • 测试
[root@app6 bin]#type -a dmesg
dmesg is aliased to `/root/bin/dmesg_with_human_timestamps.sh'
dmesg is /bin/dmesg
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • make menuconfig过程解析作者 codercjg 在 28 九月 2015, 5:27 下午 make...
    codercjg阅读 949评论 0 1
  • Linux print system linux中的调试方法有很多种,但我们最常用的也是最关键的调试工具应该就是使...
    Creator_Ly阅读 1,933评论 0 4
  • 系统启动是一项非常复杂的程序,因为内核得先检测硬件并加载适当的驱动程序后,接下来则必须要调用程序来准备好系统运行的...
    Zhang21阅读 11,561评论 3 10
  • 昱记-20161207周三 23:45 晴 《十分钟后开始使用英语》 笔记 在《人人都是工程师》之前,有一篇日志是...
    知昱阅读 348评论 0 2
  • 课程这么快就结束了,感谢心蓝老师教导,能有机会学习到水彩课程,虽然我画的不好看,不过万事开头难,我想后面多练习,会...
    鱼玄机66阅读 201评论 1 1