了解 Linux 中的日誌記錄
據我了解,Linux核心記錄到
/proc/kmsg
文件(主要是硬體相關的消息)和/dev/log
套接字?其他地方?其他應用程序是否也可以向/proc/kmsg
or發送消息/dev/log
?最後但同樣重要的是,我是否正確的是系統日誌守護程序(rsyslog,syslog-ng)檢查來自這兩個地方的消息,然後將這些消息分發到各種文件,例如/var/log/messages
甚至/var/log/kern.log
中央系統日誌伺服器?
簡而言之,它或多或少是這樣的:
核心將消息(使用該
printk()
函式)記錄到核心空間中的環形緩衝區。這些消息以兩種方式提供給使用者空間應用程序:通過/proc/kmsg
文件(前提是/proc
已掛載)和通過sys_syslog
系統呼叫。有兩個主要的應用程序可以讀取(並且在某種程度上可以控制)核心的環形緩衝區:
dmesg(1)
和klogd(8)
. 前者旨在由使用者按需執行,以列印環形緩衝區的內容。/proc/kmsg
後者是一個守護程序,它從(或呼叫sys_syslog
,如果未安裝)讀取消息/proc
並將它們發送到syslogd(8)
或控制台。這涵蓋了核心方面。在使用者空間中,有
syslogd(8)
. 這是一個監聽多個 UNIX 域套接字(主要是/dev/log
,但也可以配置其他)的守護程序,並且可以選擇監聽 UDP 埠 514 以獲取消息。它還接收來自klogd(8)
(syslogd(8)
不關心/proc/kmsg
)的消息。然後它將這些消息寫入 中的某些文件/log
或命名管道,或將它們發送到某些遠端主機(通過syslog
協議,在 UDP 埠 514 上),如/etc/syslog.conf
.使用者空間應用程序通常使用該
libc
功能syslog(3)
來記錄消息。libc
將這些消息發送到 UNIX 域套接字/dev/log
(它們由 讀取syslogd(8)
),但如果應用程序被chroot(2)
-ed 消息可能最終被寫入其他套接字,fi 到/var/named/dev/log
. 當然,發送這些日誌的應用程序syslogd(8)
必須就這些套接字的位置達成一致。由於這些原因syslogd(8)
,可以配置為偵聽除標準之外的其他套接字/dev/log
。最後,該
syslog
協議只是一個數據報協議。沒有什麼能阻止應用程序將系統日誌數據報發送到任何 UNIX 域套接字(假設其憑據允許它打開套接字),完全繞過該syslog(3)
功能libc
。如果數據報格式正確syslogd(8)
,則可以像使用消息一樣使用它們syslog(3)
。當然,以上僅涵蓋“經典”測井理論。其他守護程序(例如
rsyslog
andsyslog-ng
,正如你提到的)可以代替普通的syslogd(8)
,並做各種漂亮的事情,比如通過加密的 TCP 連接向遠端主機發送消息,提供高解析度時間戳等等。還有systemd
,它正在慢慢吞噬 Linux 的 UNIX 部分。systemd
有自己的日誌記錄機制,但這個故事必須由其他人講述。:)與 *BSD 世界的不同之處:
在 *BSD 上沒有
klogd(8)
,/proc
或者不存在(在 OpenBSD 上)或者大部分已經過時(在 FreeBSD 和 NetBSD 上)。syslogd(8)
從字元設備讀取核心消息/dev/klog
,並dmesg(1)
用於/dev/kmem
解碼核心名稱。只有 OpenBSD 有/dev/log
. FreeBSD 使用兩個 UNIX 域套接字/var/run/log
,var/rub/logpriv
而 NetBSD 有一個/var/run/log
.