Linux Centos với dấu thời gian dmesg


15

Tôi muốn đọc Centos 5.x dmesg của tôi với dấu thời gian, làm thế nào để tôi làm điều này?


sau này dmesg hỗ trợ cờ -T, có thể thử sử dụng -T nếu dmesg của bạn hỗ trợ nó.
ilansch

hỗ trợ centos 7+dmesg -T
rogerdpack 21/12/18

Câu trả lời:


12

dmesgđọc bộ đệm vòng nhật ký Kernel. Nó không làm dấu thời gian. Những gì bạn nên làm là cấu hình syslog để lấy các bản ghi kernel từ bộ đệm đó và gửi chúng đến một tệp (nếu nó chưa được thiết lập để làm như vậy). Lưu ý, cấu hình syslog mặc định của CentOS 5.x gửi nhật ký kernel tới /var/log/messages, như tôi nhớ.

Nếu bạn muốn gửi tất cả nhật ký kernel (dmesg) tới /var/log/kern.log, sử dụng trình nền syslog mặc định, bạn sẽ thêm một dòng như sau vào/etc/syslog.conf

kern.*                         /var/log/kern.log

4
Cảm ơn bạn đã trả lời. Đối với bất cứ ai đang tìm kiếm chạy CentOS 6, tôi đã tìm thấy nó trong/etc/rsyslog.conf
Safado

Đúng, với CentOS (và RHEL) 6.x, họ đã thay đổi trình nền syslog mặc định từ sysklogd cũ thành rsyslog. Nó cũng có sẵn dưới dạng gói (được hỗ trợ) cho RHEL / CentOS 5.x.
Christopher Cashell

1
Chà, tôi đã có cái này trong danh sách những thứ cần tìm ra, nhưng bây giờ bạn đã cứu tôi một số người
Safado

8

Có giải pháp "Kích hoạt dấu thời gian cho bộ đệm vòng dmesg / Kernel"

Bạn có thể thêm:

printk.time=1

để cmdline kernel.

Đối với tôi, tôi đã thêm vào RC.local trên tất cả các máy có con rối. Nó dễ hơn đối với tôi):

if test -f /sys/module/printk/parameters/time; then
   echo 1 > /sys/module/printk/parameters/time
fi

nó hoạt động với tôi
c4f4t0r

5
Sử dụng rc.localthực sự là một giải pháp xấu cho việc này (sử dụng rc.localhầu như luôn luôn là một giải pháp xấu cho mọi thứ). Một giải pháp tốt hơn sẽ là đưa printk.time = 1vào /etc/sysctl.confhoặc một tập tin /etc/sysctl.d/. Đó là lý do những tập tin này tồn tại. Việc nhồi nhét những thứ vào rc.localcuối cùng sẽ để lại cho bạn một khởi đầu mong manh, hỗn độn, lộn xộn, không đáng tin cậy.
Christopher Cashell

Đây là những gì trong nhận xét từ @ChristopherCashell là câu trả lời đúng duy nhất cho câu hỏi này. Thật xấu hổ vì nó không phải là câu trả lời thực sự.
Petr

1

Tôi đã viết kịch bản đơn giản này. Vâng, nó chậm. Nếu bạn muốn một cái gì đó nhanh hơn, bạn thực sự viết một kịch bản trên perl, python hoặc một cái gì đó khác. Tôi chắc rằng tập lệnh đơn giản này có thể cung cấp cho bạn thông tin về cách tính toán nó.

Xin lưu ý rằng tôi đã bỏ qua phần giây được đăng ký trong mỗi dòng (sau dấu thời gian).

#!/bin/bash
localtime() {
 perl -e "print(localtime($1).\"\n\");";
}

upnow="$(cut -f1 -d"." /proc/uptime)"
upmmt="$(( $(date +%s) - ${upnow} ))"

dmesg | while read line; do
 timestamp="$(echo "${line}" | sed "s/^\[ *\([0-9]\+\).*/\1/g")"
 timestamp=$(( ${timestamp} + ${upmmt} ))
 echo "${line}" | sed "s/^[^]]\+]\(.*\)/$(localtime "${timestamp}") -\1/g"
done

Tôi hy vọng nó sẽ giúp. :)


0

Sửa đổi tập lệnh trong trường hợp dòng không bắt đầu bằng "["

#!/bin/bash
localtime() {
 perl -e "print(localtime($1).\"\n\");";
}

upnow=$(cut -f1 -d"." /proc/uptime)
upmmt=$(( $(date +%s) - ${upnow} ))

dmesg \
| while read LINE; do
    if [ "$(echo ${LINE} | egrep -v "^\[")" == "" ] ; then
        timestamp=$(echo "${LINE}" | sed "s/^\[ *\([0-9]\+\).*/\1/g")
        timestamp=$(( ${timestamp} + ${upmmt} ))
        echo "${LINE}" | sed "s/^[^]]\+]\(.*\)/$(localtime "${timestamp}") -\1/g"
    else
        echo "${LINE}"
    fi
done

0

Đây là bản cập nhật về đề xuất của Plutoid, loại bỏ các khoảng trắng hàng đầu khỏi dấu thời gian.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;' 
  • perl -n là một cách để đọc đầu vào tiêu chuẩn và đọc vào biến $ _.
  • Phần thân (không phải phần BEGIN) sau đó được chạy một lần cho mỗi dòng.
  • BEGIN chạy mã trong {} một lần.
  • $ a là sự khởi đầu của dmesg kể từ kỷ nguyên (giây)
  • Lệnh s / ... lấy giá trị bằng $ _ và thay thế \ s * #####. ###### một phần của dấu thời gian bằng phiên bản "localtime" của phần bù dmesg ($ 1) được thêm vào thời gian bắt đầu hệ thống ($ a)
  • in $ a in dmesg bằng dấu thời gian thân thiện địa phương thay thế cho dấu thời gian "giây kể từ khi khởi động".

1
Và giống như câu trả lời ban đầu, nó cần một số lời giải thích. Bạn có thể chỉnh sửa bài viết của mình, chia nhỏ nó và bước qua nó không?
Cory Knutson

-1

Một chút kịch bản perl như dưới đây. Đó là một cách chung, và tôi không phải là tác giả.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
  • perl -n là một cách để đọc đầu vào tiêu chuẩn và đọc thành biến $ _.
  • Phần thân (không phải phần BEGIN) sau đó được chạy một lần cho mỗi dòng.
  • BEGIN chạy mã trong {} một lần.
  • $ a là sự khởi đầu của dmesg kể từ kỷ nguyên
  • Lệnh s / ... lấy giá trị bằng $ _ và thay thế phần #####. ###### của dấu thời gian bằng phiên bản "localtime" của phần bù dmesg ($ 1) được thêm vào hệ thống bắt đầu thời gian ($ a)
  • in $ a in dmesg bằng dấu thời gian thân thiện địa phương thay thế cho dấu thời gian "giây kể từ khi khởi động".

1
Câu trả lời này cần một số giải thích thêm.
kasperd

@kasperd Đây là ý nghĩa của nó: - perl -n là cách đọc đầu vào tiêu chuẩn và đọc thành biến $ _. Phần thân (không phải phần BEGIN) sau đó được chạy một lần cho mỗi dòng. - BEGIN chạy mã trong {} một lần. $ a là sự khởi đầu của dmesg kể từ epoch - s/...Lệnh lấy giá trị bằng $ _ và thay thế #####. ###### một phần của dấu thời gian bằng phiên bản "localtime" của phần bù dmesg ($ 1 ) được thêm vào thời gian bắt đầu hệ thống ($ a). - print $ain dmesg bằng dấu thời gian thân thiện với ngôn ngữ thay thế cho dấu thời gian "giây kể từ khi khởi động".
dadinck
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.