dmesg日志中加入時間戳

dmesg日志中加入時間戳

dmesg命令相關(guān)包

  • 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,不開啟狀態(tài)

  • /sys/module/*包含所有編譯的模塊信息

這里有系統(tǒng)中所有模塊的信息,不論這些模塊是以內(nèi)聯(lián)(inlined)方式編譯到內(nèi)核映像文件(vmlinuz)中還是編譯為外部模塊(ko文件),都可能會出現(xiàn)在 /sys/module 中:

  • 編譯為外部模塊(ko文件)在加載后會出現(xiàn)對應(yīng)的 /sys/module/<module_name>/, 并且在這個目錄下會出現(xiàn)一些屬性文件和屬性目錄來表示此外部模塊的一些信息,如版本號、加載狀態(tài)、所提供的驅(qū)動程序等;
  • 編譯為內(nèi)聯(lián)方式的模塊則只在當(dāng)它有非0屬性的模塊參數(shù)時會出現(xiàn)對應(yīng)的
    /sys/module/<module_name>, 這些模塊的可用參數(shù)會出現(xiàn)在
    /sys/modules/<modname>/parameters/<param_name>
  • /sys/module/printk/parameters/time 這個可讀寫參數(shù)控制著內(nèi)聯(lián)模塊 printk 在打印內(nèi)核消息時是否加上時間前綴;所有內(nèi)聯(lián)模塊的參數(shù)也可以由 <module_name>.<param_name>=<value> 的形式寫在內(nèi)核啟動參數(shù)上
  • 如啟動內(nèi)核時加上參數(shù) printk.time=1 與 向 /sys/module/printk/parameters/time 寫入1的效果相同;沒有非0屬性參數(shù)的內(nèi)聯(lián)模塊不會出現(xiàn)于此。

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

解決方法一:通過新增監(jiān)控日志kern來解決

1. 修改/sys/module/printk/parameters/time參數(shù)

  • 使其開始為今后日志添加時間戳,但是重啟后會失效
  • 可以使用dmesg查詢
[root@centos6 ~]#echo 1 >/sys/module/printk/parameters/time
[root@centos6 ~]#cat  /sys/module/printk/parameters/time
Y

2. 在監(jiān)控日志配置/etc/rsyslog.conf中,添加監(jiān)控kern的信息,并重啟rsyslog服務(wù)

  • 從服務(wù)重啟后開始生效,kern日志都記錄在/var/log/kern.log
  • 但重啟后用dmesg查看的日志依然沒有時間戳;因?yàn)?sys/下的目錄存放的是系統(tǒng)內(nèi)存的信息,重啟會失效;
  • 同時,/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 /]#

  • 查詢?nèi)罩?/li>
[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. 重啟后查詢?nèi)罩?/h4>
  • 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

解決方法二:修改內(nèi)核參數(shù)

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. 修改啟動時的內(nèi)核參數(shù)/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,備份原配置; 在內(nèi)核啟動時添加參數(shù),這樣重啟就不會失效了

  • 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信息

  • 已經(jīng)打上了時按戳,但不是人類可讀的形式,這個數(shù)值是值開啟到日志發(fā)生時所經(jīng)過的時間,單位是秒,需要做換算
[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 /]#

兩種方法相同點(diǎn)

  1. 都能實(shí)現(xiàn),配置完成后立刻生效,記錄配置完成后的相關(guān)帶時間戳的日志信息
  2. 都能實(shí)現(xiàn)重啟后依然顯示帶時間戳的內(nèi)核日志信息
  3. 對配置前的日志都不能再加上時間戳了,因?yàn)橹暗墓δ懿殚_啟;
  4. dmesg顯示的時間均為人類不易讀的格式,需要轉(zhuǎn)換

兩種方法不同點(diǎn)

  1. 方法一添加了kern日志,dmesg重啟后不帶時間戳,同時,kern日志不能直接用 dmesg查看
  2. 方法二修改了內(nèi)核參數(shù),內(nèi)核信息都可以從dmesg中查看,重啟依然有效
  3. kern日志的時間戳是人類易讀的方式,dmesg時間戳不易讀

時間戳轉(zhuǎn)換腳本

還有點(diǎn)小BUG,過濾不全,僅供參考

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

dmesg | while read msg; do

    # 過濾無時間戳的日志條目,無需轉(zhuǎn)換
    if [ `echo "$msg" |cut -c 1` !=  "[" ] ;then
        echo $msg
        continue
    fi
    
    # 獲取每條日志的非可讀秒數(shù)
    no_human_timestamps=`echo $msg |grep -E  -o "\b[0-9]+\.[0-9]{6}\b"`
    
    # 獲取每條日志的從1970-01-01開始到日志記錄時的秒數(shù)
    real=`echo "$(date +%s)-$(awk '{print $1}' /proc/uptime)+$no_human_timestamps" |bc`
    
    # 人類可讀格式
    human_timestamps=`date -d @$real`
    
    # 轉(zhuǎn)換并打印
    echo "$msg" | sed -rn 's@'"$no_human_timestamps"'@'"$human_timestamps"'@p' 
done
  • 設(shè)置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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • make menuconfig過程解析作者 codercjg 在 28 九月 2015, 5:27 下午 make...
    codercjg閱讀 1,231評論 0 1
  • Linux print system linux中的調(diào)試方法有很多種,但我們最常用的也是最關(guān)鍵的調(diào)試工具應(yīng)該就是使...
    Creator_Ly閱讀 2,024評論 0 4
  • 系統(tǒng)啟動是一項(xiàng)非常復(fù)雜的程序,因?yàn)閮?nèi)核得先檢測硬件并加載適當(dāng)?shù)尿?qū)動程序后,接下來則必須要調(diào)用程序來準(zhǔn)備好系統(tǒng)運(yùn)行的...
    Zhang21閱讀 12,325評論 3 10
  • 昱記-20161207周三 23:45 晴 《十分鐘后開始使用英語》 筆記 在《人人都是工程師》之前,有一篇日志是...
    知昱閱讀 411評論 0 2
  • 課程這么快就結(jié)束了,感謝心藍(lán)老師教導(dǎo),能有機(jī)會學(xué)習(xí)到水彩課程,雖然我畫的不好看,不過萬事開頭難,我想后面多練習(xí),會...
    魚玄機(jī)66閱讀 237評論 1 1

友情鏈接更多精彩內(nèi)容