149

タイムスタンプを理解しようとしていdmesgますが、それを変換してJava日付/カスタム日付形式に変更するのは難しいと思います。

dmesg ログの例:

[14614.647880] airo(eth1): link lost (missed beacons)

14614.647880では、標準の日付に変換するにはどうすればよいでしょうか。

4

10 に答える 10

242

タイムスタンプを理解するdmesgのは非常に簡単です。カーネルが起動してからの秒数です。したがって、起動時間 ( uptime) を使用して、秒を合計し、好きな形式で表示できます。

または、-Tコマンド ライン オプションを使用してdmesg、人間が読める形式を解析することもできます。

マニュアルページから:

-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.
于 2012-12-15T09:01:47.740 に答える
18

そのため、 KevZeroはより厄介なソリューションを要求したので、次のことを思い付きました。

sed -r 's#^\[([0-9]+\.[0-9]+)\](.*)#echo -n "[";echo -n $(date --date="@$(echo "$(grep btime /proc/stat|cut -d " " -f 2)+\1" | bc)" +"%c");echo -n "]";echo -n "\2"#e'

次に例を示します。

$ dmesg|tail | sed -r 's#^\[([0-9]+\.[0-9]+)\](.*)#echo -n "[";echo -n $(date --date="@$(echo "$(grep btime /proc/stat|cut -d " " -f 2)+\1" | bc)" +"%c");echo -n "]";echo -n "\2"#e'
[2015-12-09T04:29:20 COT] cfg80211:   (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 0 mBm), (N/A)
[2015-12-09T04:29:23 COT] wlp3s0: authenticate with dc:9f:db:92:d3:07
[2015-12-09T04:29:23 COT] wlp3s0: send auth to dc:9f:db:92:d3:07 (try 1/3)
[2015-12-09T04:29:23 COT] wlp3s0: authenticated
[2015-12-09T04:29:23 COT] wlp3s0: associate with dc:9f:db:92:d3:07 (try 1/3)
[2015-12-09T04:29:23 COT] wlp3s0: RX AssocResp from dc:9f:db:92:d3:07 (capab=0x431 status=0 aid=6)
[2015-12-09T04:29:23 COT] wlp3s0: associated
[2015-12-09T04:29:56 COT] thinkpad_acpi: EC reports that Thermal Table has changed
[2015-12-09T04:29:59 COT] i915 0000:00:02.0: BAR 6: [??? 0x00000000 flags 0x2] has bogus alignment
[2015-12-09T05:00:52 COT] thinkpad_acpi: EC reports that Thermal Table has changed

パフォーマンスを少し向上させたい場合は、代わりにprocからのタイムスタンプを変数に入れます:)

于 2015-12-10T02:18:31.290 に答える
5

dmesg の最近のバージョンでは、dmesg -T.

于 2014-07-10T08:45:36.377 に答える
4

たとえば Andoid で-Tオプションがない場合は、バージョンを使用できます。以下は、他のいくつかの問題も解決します。dmesgbusybox

  1. 形式の[0.0000]前には、色情報の配置が間違っているように見えるもの、 のような接頭辞が付いています<6>
  2. float から整数を作成します。

このブログ投稿に触発されています。

#!/bin/sh                                                                                                               
# Translate dmesg timestamps to human readable format                                                                   

# uptime in seconds                                                                                                     
uptime=$(cut -d " " -f 1 /proc/uptime)                                                                                  

# remove fraction                                                                                                       
uptime=$(echo $uptime | cut -d "." -f1)                                                                                 

# run only if timestamps are enabled                                                                                    
if [ "Y" = "$(cat /sys/module/printk/parameters/time)" ]; then                                                          
  dmesg | sed "s/[^\[]*\[/\[/" | sed "s/^\[[ ]*\?\([0-9.]*\)\] \(.*\)/\\1 \\2/" | while read timestamp message; do      
    timestamp=$(echo $timestamp | cut -d "." -f1)                                                                       
    ts1=$(( $(busybox date +%s) - $uptime + $timestamp ))                                                               
    ts2=$(busybox date -d "@${ts1}")                                                                                    
    printf "[%s] %s\n" "$ts2" "$message"                                                                                
  done                                                                                                                  
else                                                                                                                    
  echo "Timestamps are disabled (/sys/module/printk/parameters/time)"                                                   
fi                                                                                                                      

ただし、この実装はかなり遅いことに注意してください。

于 2015-06-13T22:05:21.957 に答える
3

/proc/stat の「btime」を参照する必要があります。これは、システムが最後に起動されたときの Unix エポック時間です。次に、そのシステムの起動時間に基づいて、dmesg で指定された経過秒数を追加して、各イベントのタイムスタンプを計算できます。

于 2013-02-05T02:41:37.007 に答える