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?
dmesg -T
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?
dmesg -T
Câu trả lời:
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
/etc/rsyslog.conf
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
rc.local
thực sự là một giải pháp xấu cho việc này (sử dụng rc.local
hầ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 = 1
vào /etc/sysctl.conf
hoặ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.local
cuố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.
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. :)
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
Đâ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 $_;'
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 $ _.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 $a
in 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".