首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将dmesg时间戳转换为自定义日期格式?

如何将dmesg时间戳转换为自定义日期格式?
EN

Stack Overflow用户
提问于 2012-12-15 16:55:52
回答 8查看 173.1K关注 0票数 140

我正在尝试理解dmesg时间戳,并发现很难将其转换为java日期/自定义日期格式。

dmesg日志示例:

代码语言:javascript
复制
[14614.647880] airo(eth1): link lost (missed beacons)

那么如何将14614.647880转换为标准日期呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-12-15 17:01:48

理解dmesg时间戳非常简单:它是内核启动以来的时间。因此,有了启动时间(uptime),您可以将秒数相加,并以您喜欢的任何格式显示它们。

或者更好的方法是,使用dmesg-T命令行选项并解析人类可读的格式。

man page

代码语言:javascript
复制
-T, --ctime
    Print human readable timestamps. The timestamp could be inaccurate!

    The time source used for the logs is not updated after system SUSPEND/RESUME.
票数 231
EN

Stack Overflow用户

发布于 2013-10-09 20:39:08

dr answer的帮助下,我写了一个变通方法,可以将put转换为put。如果你没有任何时间戳或者已经正确的时间戳,它不会破坏任何东西。

代码语言:javascript
复制
dmesg_with_human_timestamps () {
    $(type -P dmesg) "$@" | perl -w -e 'use strict;
        my ($uptime) = do { local @ARGV="/proc/uptime";<>}; ($uptime) = ($uptime =~ /^(\d+)\./);
        foreach my $line (<>) {
            printf( ($line=~/^\[\s*(\d+)\.\d+\](.+)/) ? ( "[%s]%s\n", scalar localtime(time - $uptime + $1), $2 ) : $line )
        }'
}
alias dmesg=dmesg_with_human_timestamps

此外,还可以很好地了解dmesg时间戳转换逻辑以及如何在没有时间戳时启用时间戳:https://supportcenter.checkpoint.com/supportcenter/portal?eventSubmit_doGoviewsolutiondetails=&solutionid=sk92677

票数 33
EN

Stack Overflow用户

发布于 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机器上:

代码语言:javascript
复制
# 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:

代码语言:javascript
复制
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
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13890789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档