我正在尝试理解dmesg
时间戳,并发现很难将其转换为java日期/自定义日期格式。
dmesg日志示例:
[14614.647880] airo(eth1): link lost (missed beacons)
那么如何将14614.647880
转换为标准日期呢?
发布于 2016-04-02 00:21:33
对于没有"dmesg -T“的系统,比如RHEL/CentOS6,我喜欢lucas-cimon之前提供的"dmesg_with_human_timestamps”函数。不过,它在一些运行时间较长的机器上遇到了一些问题。事实证明,dmesg中的内核时间戳是从单个CPU保存的正常运行时间值派生而来的。随着时间的推移,这会与实时时钟不同步。因此,最新dmesg条目的最准确转换将基于CPU时钟,而不是/proc/uptime。例如,在特定的CentOS 6.6机器上:
# grep "\.clock" /proc/sched_debug | head -1
.clock : 32103895072.444568
# uptime
15:54:05 up 371 days, 19:09, 4 users, load average: 3.41, 3.62, 3.57
# cat /proc/uptime
32123362.57 638648955.00
考虑到以毫秒为单位的CPU正常运行时间,这里有将近5个半小时的偏移量。因此,我修改了脚本并在此过程中将其转换为本机bash:
dmesg_with_human_timestamps () {
FORMAT="%a %b %d %H:%M:%S %Y"
now=$(date +%s)
cputime_line=$(grep -m1 "\.clock" /proc/sched_debug)
if [[ $cputime_line =~ [^0-9]*([0-9]*).* ]]; then
cputime=$((BASH_REMATCH[1] / 1000))
fi
dmesg | while IFS= read -r line; do
if [[ $line =~ ^\[\ *([0-9]+)\.[0-9]+\]\ (.*) ]]; then
stamp=$((now-cputime+BASH_REMATCH[1]))
echo "[$(date +"${FORMAT}" --date=@${stamp})] ${BASH_REMATCH[2]}"
else
echo "$line"
fi
done
}
alias dmesgt=dmesg_with_human_timestamps
https://stackoverflow.com/questions/13890789
复制相似问题