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)
- 都能實(shí)現(xiàn),配置完成后立刻生效,記錄配置完成后的相關(guān)帶時間戳的日志信息
- 都能實(shí)現(xiàn)重啟后依然顯示帶時間戳的內(nèi)核日志信息
- 對配置前的日志都不能再加上時間戳了,因?yàn)橹暗墓δ懿殚_啟;
- dmesg顯示的時間均為人類不易讀的格式,需要轉(zhuǎn)換
兩種方法不同點(diǎn)
- 方法一添加了kern日志,dmesg重啟后不帶時間戳,同時,kern日志不能直接用 dmesg查看
- 方法二修改了內(nèi)核參數(shù),內(nèi)核信息都可以從dmesg中查看,重啟依然有效
- 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
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
/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
/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
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
[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)小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
[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