Linux-Kernel

了解 Linux 中的日誌記錄

  • July 6, 2016

據我了解,Linux核心記錄到/proc/kmsg文件(主要是硬體相關的消息)和/dev/log套接字?其他地方?其他應用程序是否也可以向/proc/kmsgor發送消息/dev/log?最後但同樣重要的是,我是否正確的是系統日誌守護程序(rsyslogsyslog-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)

當然,以上僅涵蓋“經典”測井理論。其他守護程序(例如rsyslogand syslog-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/logvar/rub/logpriv而 NetBSD 有一個/var/run/log.

引用自:https://unix.stackexchange.com/questions/205883