/ var / log / * 타임 스탬프 상관


20

/var/log/messages, /var/log/syslog및 일부 다른 로그 파일은과 같은 절대 시간이 포함 된 타임 스탬프를 사용합니다 Jan 13 14:13:10.

/var/log/Xorg.0.log/var/log/dmesg의 출력은 $ dmesg다음과 같은 형식을 사용합니다.

[50595.991610] malkovich: malkovich malkovich malkovich malkovich

시작 이후 숫자가 초와 마이크로 초를 나타내는 것으로 추측합니다.

그러나이 두 타임 스탬프 세트 (의 출력 사용)를 연관시키려는 시도 uptime는 약 5000 초의 불일치를 나타 냈습니다.

이것은 대략 내 컴퓨터가 정지 된 시간입니다.

dmesg 및 Xorg에서 사용하는 숫자 타임 스탬프를 절대 타임 스탬프에 매핑하는 편리한 방법이 있습니까?

최신 정보

이것을 이해하기위한 예비 단계로서, 또한 내 질문을 좀 더 명확하게 하기 위해 시간 차이 를 구문 분석 하고 출력 하는 Python 스크립트 를 작성했습니다 /var/log/syslog. ubuntu 10.10을 실행하는 내 컴퓨터에서 해당 파일에는 dmesg 타임 스탬프와 syslog 타임 스탬프가 찍혀있는 수많은 커널 시작 행이 포함되어 있습니다. 스크립트는 커널 타임 스탬프를 포함하는 해당 파일의 각 줄에 대한 줄을 출력합니다.

용법:

python syslogdriver.py /var/log/syslog | column -nts $'\t'

Expurgated 출력 (열 정의는 아래 참조) :

abs              abs_since_boot  rel_time      rel_offset  message
Jan 13 07:49:15  32842.1276569   32842.301498  0           malkovich malkovich

... rel_offset은 모든 중간 줄에 대해 0입니다 ...

Jan 13 09:55:14  40401.1276569   40401.306386  0           PM: Syncing filesystems ... done.
Jan 13 09:55:14  40401.1276569   40401.347469  0           PM: Preparing system for mem sleep
Jan 13 11:23:21  45688.1276569   40402.128198  -5280       Skipping EDID probe due to cached edid
Jan 13 11:23:21  45688.1276569   40402.729152  -5280       Freezing user space processes ... (elapsed 0.03 seconds) done.
Jan 13 11:23:21  45688.1276569   40402.760110  -5280       Freezing remaining freezable tasks ... (elapsed 0.01 seconds) done.
Jan 13 11:23:21  45688.1276569   40402.776102  -5280       PM: Entering mem sleep

... rel_offset남은 모든 줄에 대해 -5280입니다 ...

Jan 13 11:23:21  45688.1276569   40403.149074  -5280       ACPI: Preparing to enter system sleep state S3
Jan 13 11:23:21  45688.1276569   40403.149477  -5280       PM: Saving platform NVS memory
Jan 13 11:23:21  45688.1276569   40403.149495  -5280       Disabling non-boot CPUs ...
Jan 13 11:23:21  45688.1276569   40403.149495  -5280       Back to C!
Jan 13 11:23:21  45688.1276569   40403.149495  -5280       PM: Restoring platform NVS memory
Jan 13 11:23:21  45688.1276569   40403.151034  -5280       ACPI: Waking up from system sleep state S3

... 마지막 줄은 조금 더 아래로 내려 오지만 여전히 출력 끝보다 훨씬 위에 있습니다. 그중 일부는 아마도 dmesg일시 중단이 발생하기 전에의 순환 버퍼에 쓰여 졌으며 syslog그 후에 만 전파 되었습니다. 이것은 왜 그들 모두가 동일한 syslog 타임 스탬프를 갖는지 설명합니다.

열 정의 :

abs syslog가 기록한 시간입니다.

abs_since_boot의 내용 /proc/uptime과 값에 따라 시스템 시작 이후의 초 단위의 시간 입니다 time.time().

rel_time 커널 타임 스탬프입니다.

rel_offset간의 차이 abs_since_bootrel_time. 나는 syslog초 정밀도 만 갖는 절대 (즉, 생성 된) 타임 스탬프 로 인한 일회성 오류를 피하기 위해 이것을 수십 초로 반올림합니다 . 실제로 (올바르게 생각합니다.) 결과가 10 이하의 오류가 발생할 가능성이 적기 때문에 실제로 올바른 방법은 아닙니다. 누군가 더 나은 아이디어를 가지고 있다면 알려주세요.

또한 syslog의 날짜 형식에 대한 몇 가지 질문이 있습니다. 특히, 나는 일년이 여기에 나타나는지 궁금합니다. 나는 추측하지 않으며, 어쨌든 TFM의 정보에 도움이 될 수 있지만 누군가 알고 있다면 유용 할 것입니다. .. 물론 누군가가이 스크립트를 펄 코드의 몇 줄을 없애는 대신 미래의 어느 시점에서 사용한다고 가정합니다.

다음 것:

따라서 여러분 중 한 사람이 환영의 계시를 전하지 않는 한, 다음 단계는 주어진 커널 타임 스탬프에 대한 시간 왜곡을 얻는 함수를 추가하는 것입니다. 절대 타임 스탬프를 얻기 위해 커널 타임 스탬프와 함께 스크립트에 하나 또는 syslog 세트를 제공 할 수 있어야합니다. 그런 다음 Xorg 문제 디버깅으로 돌아갈 수 있습니다.


1
나는 이것이 버그로 간주되고보고되어야한다고 생각한다. BTW syslog-ng는 sthon 타임 스탬프를 사용 sort하며, 파이썬 스크립트에 대해, 년, 시간대 등으로 정렬 할 수 있습니다 .
stribika

@ stribika : 그것은 커널 문제입니까 아니면 syslog 문제입니까? 아니면 둘다? syslog에 시스템이 일시 중단되었다는 알림을 받아야 할 것 같습니다. 아마도 일시 중단 및 다시 시작 후크로 해당 작업을 수행 할 수 있습니다.
intuited

나에게는 커널에 결함이있는 것 같습니다. rel_time 값은 시스템이 일시 중단 된 시간을 "건너 뛰지"않습니다. 그러나 일시 중단이 실제로 발생하기 전에 기울기가 시작되는 것이 이상합니다. Freezing user space processes수면 전에 명확하게 수행되는 값이 이미 잘못되었습니다 .
stribika

2
@ stribika : 그것에 대한 나의 작업 이론은 그 이벤트가 syslog 자체가 일시 중단 된 후에 발생하기 때문에 이력서가 끝날 때까지 syslog로 푸시되지 않는다는 것입니다.
intuited

@ stribika : 또한, 당신은 커널이 "고장"에 대해 옳습니다 : 내가 이해 한 것처럼 (재검토 후) syslog [12345.6789]..는 커널이 방출 한 텍스트 (로 시작 )에 절대 타임 스탬프를 접두어로 사용 하므로 올바르게 작동합니다 , 내 마지막 의견으로 해결 된 문제에 따라 다릅니다. 커널이 실제로 무엇을해야하는지 잘 모르겠습니다. 시작 기준 타임 스탬프의 의미에 따라 다릅니다. 일부 상황에서는 부팅 이후 시간과 달리 실행 시간 이 의미가있을 수 있습니다. 이상적으로는 두 값 모두에 대한 신뢰할만한 기록이있을 것입니다.
intuited

답변:


4

재미있는 문제, 내가 이것을 시도한 적이 있는지 확실하지 않습니다. 그러나 나는 당신이 말하고있는 타임 스탬프를 주목했으며 부팅 후 몇 초가 지난 것을 항상 믿었습니다.

내 서버에있는 syslog에는 다음이 있습니다.

Jan 10 19:58:55 wdgitial kernel: [    0.000000] Initializing cgroup subsys cpuset
Jan 10 19:58:55 wdgitial kernel: [    0.000000] Initializing cgroup subsys cpu
Jan 10 19:58:55 wdgitial kernel: [    0.000000] Linux version 2.6.32-21-server (buildd@yellow) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ) #32-Ubuntu SMP Fri Apr 16     09:17:34 UTC 2010 (Ubuntu 2.6.32-21.32-server 2.6.32.11+drm33.2)
Jan 10 19:58:55 wdgitial kernel: [    0.000000] Command line:  root=/dev/xvda1 ro quiet splash

나는 이것이 대부분의 리눅스 배포판에서 상당히 일관성이 있다고 생각할 것입니다.

여기에 타임 스탬프와 함께 날짜가 있습니다.


3

이것을 시도해 볼 수 있습니다 :

먼저 dmesg 파일의 타임 스탬프를 가져옵니다 (제 가정은 dmesg의 시간이 0 일 것입니다). 당신은 사용합니다

ls -l-시간 스타일 = + % s

/var/log$ ls -l --time-style=+%s dmesg
-rw-r----- 1 root adm 56181 1294941018 dmesg

다음과 같이 초를 사람이 읽을 수있는 날짜로 변환 할 수 있습니다.

perl -e 'print scalar localtime(1294941018)' 

읽을 수있는 이벤트 시간을 보려면 dmesg의 이벤트에서 초를 추가하십시오. dmesg 이벤트가 55.290387 초인 경우 55 또는 55.290387을 추가하십시오.

perl -e 'print scalar localtime(1294953978 + 55)'

epochal-roots 초를 읽을 수있는 시간으로 변환하는 또 다른 방법은 제안대로 date -d를 사용하는 것입니다. 'date'에 -d와 함께 제공되는 시간을 나타내도록 지시하면 @를 사용하여 변환 할 시간이 초 단위임을 나타낼 수 있습니다.

date -d "@1294953978"

"Thu Jan 13 15:26:18 CST 2011"과 같은 결과가 출력됩니다.

날짜 + % s
현재 시간을 초부터 에포크 형식으로 인쇄합니다.

쉘 수학을 수행하는 방법을 기억할 수 없으므로 일반적으로 위와 같이 perl 메소드를 사용합니다. :)


1
@ jgbelacqua : date -d @$((1294953978 + 55))적어도 bash에서. 그러나 일부 커널 타임 스탬프가 왜곡되어이 방법으로 생성 된 시간이의 해당 타임 스탬프보다 빠릅니다 /var/log/syslog. 이것은 아마도 최대 절전 모드 및 아마도 다른 것들에 더하여 RAM 일시 중단 이벤트의 결과로 발생하는 것으로 보입니다. 그 기간 동안 커널 시간이 증가하지 않기 때문입니다. 자세한 내용은 질문 업데이트를 참조하십시오.
직관

2

dmesg에서 날짜로 숫자를 매핑하는 가장 쉬운 방법은 date프로그램을 사용하는 것 입니다.

date -d "-50595 seconds"

이 명령은 현재 시간에서 50595 초를 뺀 날짜를 표시합니다.

보낸 사람 man date:

-d, --date=STRING
       display time described by STRING, not `now'

부팅 시간 이후의 시간이 아니라 전원이 켜진 시간과 숫자가 같습니다.


2

일시 중지 / 다시 시작하는 동안 시간 차이가 바뀌는 것을 언급 했으므로이 내용은 적어도 한 곳에 기록되어 있습니다. dmesg (1) 매뉴얼 페이지는 다음과 같이 말합니다.

시스템 SUSPEND / RESUME 후에 로그에 사용 된 시간 소스가 업데이트되지 않습니다.

커널이 타임 스탬프를 월 시간과 동기화되도록하는 방법을 찾지 못했습니다.


1

빠르고 더러워집니다.

$ dmesg | grep 3w | perl /root/print_time_offset.pl

해당 스크립트의 내용 :

$ cat /root/print_time_offset.pl

#!/usr/bin/perl

$uptime = `cat /proc/uptime | awk '{print $1}';`;
$boot = time() - $uptime;
chomp $boot;
while (<STDIN>) {
        if ($_ =~ /^\[([\s\d\.]+)\]/) {
                $time_offset = $1;
        }
        $real_time = sprintf scalar localtime($boot + $time_offset);
        $_ =~ s/\[[\s\d\.]+\]/\[$real_time\]/;
        print $_;
}

샘플 출력은 다음과 같습니다.

[Mon Feb 21 23:06:33 2011] 3ware 9000 Storage Controller device driver for Linux v2.26.02.012.
[Mon Feb 21 23:06:33 2011] 3w-9xxx 0000:03:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[Mon Feb 21 23:06:33 2011] 3w-9xxx 0000:03:00.0: setting latency timer to 64
[Mon Feb 21 23:06:33 2011] scsi4 : 3ware 9000 Storage Controller
[Mon Feb 21 23:06:33 2011] 3w-9xxx: scsi4: Found a 3ware 9000 Storage Controller at 0xfbcde000, IRQ: 16.
[Mon Feb 21 23:06:34 2011] 3w-9xxx: scsi4: Firmware FE9X 4.08.00.006, BIOS BE9X 4.08.00.001, Ports: 4.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Sat Feb 26 02:01:01 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=1.
[Sat Feb 26 02:01:01 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=0.
[Sat Feb 26 16:49:13 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=1.
[Sat Feb 26 17:07:19 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=0.
[Sat Mar  5 02:00:16 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=1.
[Sat Mar  5 02:00:16 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=0.
[Sat Mar  5 18:48:57 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=1.
[Sat Mar  5 19:05:17 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=0.
[Sat Mar 12 02:00:30 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=1.
[Sat Mar 12 02:00:30 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=0.

1
나는 당신이 질문의 첫 두 단락만을 읽은 것 같아요. 더 자세히 확인하십시오. 또는 컴퓨터를 일시 중지시키고 스크립트가 새로 기록 된 메시지의 절대 타임 스탬프를 올바르게보고하는지 확인하십시오.
intuited
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.