Dấu thời gian tương ứng / var / log / *


20

/var/log/messages, /var/log/syslogvà một số tệp nhật ký khác sử dụng dấu thời gian chứa thời gian tuyệt đối, như Jan 13 14:13:10.

/var/log/Xorg.0.log/var/log/dmesg, cũng như đầu ra của $ dmesg, sử dụng một định dạng trông giống như

[50595.991610] malkovich: malkovich malkovich malkovich malkovich

Tôi đoán / thu thập rằng các con số biểu thị giây và micro giây kể từ khi khởi động.

Tuy nhiên, nỗ lực của tôi để tương quan hai bộ dấu thời gian này (sử dụng đầu ra từ uptime) đã cho sự khác biệt khoảng 5000 giây.

Đây là khoảng thời gian máy tính của tôi bị đình chỉ.

Có cách nào thuận tiện để ánh xạ các dấu thời gian số được dmesg và Xorg sử dụng thành dấu thời gian tuyệt đối không?

cập nhật

Là bước đầu tiên để tìm hiểu điều này và cũng hy vọng làm cho câu hỏi của tôi rõ ràng hơn một chút, tôi đã viết một kịch bản Python để phân tích cú pháp /var/log/syslogvà đưa ra thời gian sai lệch. Trên máy của tôi, chạy Ubuntu 10.10, tệp đó chứa nhiều dòng có nguồn gốc kernel được đóng dấu cả dấu thời gian dmesg và dấu thời gian syslog. Kịch bản đầu ra một dòng cho mỗi dòng trong tệp có chứa dấu thời gian kernel.

Sử dụng:

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

Đầu ra hết hạn (xem bên dưới để biết định nghĩa cột):

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

... rel_offsetlà 0 cho tất cả các dòng can thiệp ...

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_offsetlà -5280 cho tất cả các dòng còn lại ...

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

... Các dòng cuối cùng là từ một chút nữa xuống, vẫn cao hơn cuối đầu ra. Một số trong số chúng có lẽ đã được ghi vào dmesgbộ đệm tròn trước khi đình chỉ xảy ra, và chỉ được tuyên truyền syslogsau đó. Điều này giải thích tại sao tất cả chúng đều có cùng dấu thời gian syslog.

Định nghĩa cột:

abs là thời gian đăng nhập bởi syslog.

abs_since_bootlà cùng thời gian tính bằng giây kể từ khi khởi động hệ thống, dựa trên nội dung /proc/uptimevà giá trị của time.time().

rel_time là dấu thời gian kernel.

rel_offsetlà sự khác biệt giữa abs_since_bootrel_time. Tôi làm tròn số này đến hàng chục giây để tránh các lỗi một lần do các syslogdấu thời gian tuyệt đối (nghĩa là được tạo ra ) chỉ có độ chính xác giây. Đó thực sự không phải là cách đúng đắn để làm điều đó, vì nó thực sự (tôi nghĩ ..) chỉ dẫn đến một cơ hội nhỏ hơn có lỗi ngoài 10. Nếu ai đó có một ý tưởng tốt hơn, xin vui lòng cho tôi biết.

Tôi cũng có một số câu hỏi về định dạng ngày của syslog; đặc biệt, tôi tự hỏi nếu một năm bao giờ xuất hiện trong đó. Tôi đoán là không, và trong mọi trường hợp rất có thể giúp bản thân tôi biết thông tin đó trong TFM, nhưng nếu ai đó tình cờ biết nó sẽ hữu ích. Tất nhiên, có một người nào đó sử dụng tập lệnh này vào một thời điểm nào đó trong tương lai, thay vì chỉ sử dụng một vài dòng mã Perl.

Kế tiếp:

Vì vậy, trừ khi một số tiết lộ chào mừng là do một trong các Bạn đưa ra, bước tiếp theo của tôi sẽ là thêm một hàm để có được độ lệch thời gian cho dấu thời gian kernel đã cho. Tôi có thể cung cấp tập lệnh một hoặc một tập các nhật ký hệ thống, cùng với dấu thời gian kernel, để có được dấu thời gian tuyệt đối. Sau đó, tôi có thể quay lại để gỡ lỗi các vấn đề Xorg của mình, hiện đang thoát khỏi tôi.


1
Tôi nghĩ rằng điều này đủ điều kiện là một lỗi và nên được báo cáo. BTW syslog-ng sử dụng các dấu thời gian lành mạnh mà bạn có thể sắp xếp theo sort, có năm, múi giờ, v.v. +1 cho tập lệnh python.
stribika

@stribika: đó sẽ là vấn đề kernel hay vấn đề syslog? Hoặc cả hai? Có vẻ như syslog cần được thông báo rằng hệ thống đã bị treo .. có lẽ nó có thể tự làm điều đó bằng cách treo và tiếp tục móc.
trực giác

Đối với tôi có vẻ như kernel bị lỗi. Các giá trị rel_time không "bỏ qua" thời gian trong khi hệ thống bị treo. Tôi thấy lạ là tuy nhiên xiên bắt đầu trước khi đình chỉ thực sự xảy ra. Các giá trị đã sai Freezing user space processesmà được thực hiện rõ ràng trước khi ngủ.
stribika

2
@stribika: Lý thuyết làm việc của tôi về điều đó là những sự kiện đó không được đẩy ra syslog cho đến sau khi tiếp tục, bởi vì chúng xảy ra sau khi syslog bị đình chỉ.
trực giác

@stribika: Ngoài ra, bạn nói đúng về hạt nhân "có lỗi": vì tôi hiểu nó (sau khi xem xét lại), syslog chỉ tiền tố dấu thời gian tuyệt đối cho văn bản (bắt đầu bằng [12345.6789]..) được phát ra bởi kernel, vì vậy nó đang làm mọi thứ chính xác , tùy thuộc vào các vấn đề được giải quyết bởi bình luận cuối cùng của tôi. Tôi không chắc hạt nhân thực sự nên làm gì ở đây; nó phụ thuộc vào những dấu thời gian liên quan đến khởi động có nghĩa là gì. Thời gian chạy (trái ngược với thời gian kể từ khi khởi động) có thể có ý nghĩa trong một số bối cảnh. Tôi đoán lý tưởng sẽ có một hồ sơ đáng tin cậy về cả hai giá trị đó.
trực giác

Câu trả lời:


4

Vấn đề thú vị, Không chắc chắn tôi đã từng thử làm điều này. Nhưng tôi đã nhận thấy dấu thời gian mà bạn đang nói và tôi luôn tin rằng đó là vài giây kể từ khi khởi động.

Trong syslog của tôi, tôi có trên máy chủ của mình, tôi có:

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

Tôi sẽ tưởng tượng điều này khá phù hợp với hầu hết các bản phân phối Linux vì đây là hạt nhân phun ra thứ đó.

Và ở đây tôi có ngày cùng với dấu thời gian.


3

Bạn có thể thử cái này:

Đầu tiên, lấy dấu thời gian của tệp dmesg (giả định của tôi là đây sẽ là thời gian 0 của dmesg). Bạn sẽ sử dụng

ls -l --time-style = +% s

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

Bạn có thể chuyển đổi giây thành một ngày có thể đọc được với con người

perl -e 'print scalar localtime(1294941018)' 

Vì vậy, để xem thời gian sự kiện có thể đọc được, hãy thêm vào giây từ sự kiện trong dmesg. Nếu sự kiện dmesg là 55.290387 giây, hãy thêm 55 hoặc 55.290387:

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

Một cách khác để chuyển đổi giây gốc có thời gian thành thời gian có thể đọc được là sử dụng ngày -d như đề xuất. Nếu bạn nói 'ngày' biểu thị thời gian được cung cấp với -d, bạn có thể chỉ ra rằng thời gian được chuyển đổi là tính bằng giây kể từ khi sử dụng @.

date -d "@1294953978"

Điều này mang lại cho bạn một cái gì đó như "Thu Jan 13 15:26:18 CST 2011" làm đầu ra.

ngày +% s
sẽ in thời gian hiện tại ở định dạng giây kể từ giây.

Tôi không thể nhớ làm thế nào để làm toán toán vỏ, vì vậy tôi thường sử dụng phương pháp perl như trên. :)


1
@jgbelacqua: Bạn muốn date -d @$((1294953978 + 55)), ít nhất là dưới bash. Tuy nhiên, một số dấu thời gian kernel bị lệch, có nghĩa là thời gian được tạo ra bởi phương thức này sẽ sớm hơn dấu thời gian tương ứng của chúng /var/log/syslog. Có vẻ như điều này xảy ra là kết quả của các sự kiện đình chỉ RAM, có lẽ ngoài chế độ ngủ đông và có thể một số nội dung khác, vì thời gian của nhân không tăng trong các khoảng thời gian đó. Xem cập nhật câu hỏi để biết thêm.
trực giác

2

Cách dễ nhất để ánh xạ số từ dmesg đến một ngày là sử dụng datechương trình.

date -d "-50595 seconds"

Lệnh này hiển thị ngày cho thời gian hiện tại trừ 50595 giây.

Từ man date:

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

Con số này bằng với thời gian bật nguồn, không phải là thời gian trôi qua kể từ khi khởi động.


2

Vì bạn lưu ý thời gian thay đổi trong quá trình tạm dừng / tiếp tục, tôi sẽ lưu ý rằng điều này được ghi lại ở ít nhất một nơi. Trang người đàn ông dmesg (1) nói:

Nguồn thời gian được sử dụng cho các bản ghi không được cập nhật sau khi hệ thống SUSPEND / RESUME.

Tôi không thể tìm ra cách làm cho kernel giữ các dấu thời gian này đồng bộ với thời gian treo tường.


1

Nhanh, bẩn, làm việc.

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

Nội dung của kịch bản đó:

$ 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 $_;
}

Đầu ra mẫu như sau:

[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
Tôi đoán bạn chỉ đọc vài đoạn đầu của câu hỏi. Kiểm tra nó một lần nữa chi tiết hơn. Hoặc, thay vào đó, hãy thử tạm dừng máy tính của bạn và kiểm tra xem liệu tập lệnh của bạn có báo cáo chính xác dấu thời gian tuyệt đối của các tin nhắn mới được ghi lại hay không.
trực giác
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.