Linux

如果沒有安裝或活動日誌記錄守護程序,記錄器生成的日誌會發生什麼情況

  • July 12, 2021

如果您的 Linux 發行版沒有安裝日誌記錄守護程序,或者禁用了日誌記錄守護程序,那麼該logger命令生成的日誌會發生什麼情況?

我有帶有 rsyslog 服務的 Ubuntu 20.04.2。當我關閉此服務時,我仍然可以使用該logger命令,系統日誌中不會寫入任何內容,但該命令仍然接受我的輸入並且退出程式碼為零。

當沒有日誌服務時,生成的日誌會發生什麼logger

該命令如何在logger沒有地方發送日誌的情況下工作?如果沒有任何東西可以接收日誌,為什麼會logger成功退出?

’logger’ 將數據發送到 Unix 套接字/dev/log。(儘管位於 /dev 中,但它是一個套接字。)

在大多數 Linux 發行版上,這個套接字不再屬於傳統的 syslog 守護程序——它的另一端實際上並不直接進入 rsyslog。相反,/dev/log 套接字歸systemd-journald服務所有,該服務仍在執行並接收消息。

# fuser -v /dev/log
                                USER        PID ACCESS COMMAND
/run/systemd/journal/dev-log:    root          1 F.... systemd
                                root        304 F.... systemd-journal

(請注意,init 也持有套接字——如果 journald 停止,但套接字上有一些活動,init 將自動再次啟動服務……就像過去為 TCP 服務所做的’inetd’。)

Systemd-journald 將日誌儲存在 /var/log/journal 中,您可以使用它journalctl -f而不是通常的 ’tail -f’ 來讀取它(它們是索引二進制格式)。通常,即使 rsyslogd 關閉,通過 /dev/log 的消息也會繼續寫入那裡。

$ logger Hello

$ journalctl -n 1
Jul 12 18:12:26 ember root[951422]: Hello

在這樣的系統中,rsyslogd 和 syslog-ng 包只接收來自 systemd-journald 的中繼消息,而不是直接來自程序。它們要麼通過監聽不同的套接字(在 /run/systemd 內)工作,journald 將所有消息轉發到該套接字,要麼直接從 /var/log/journal 讀取二進制日誌文件。

(通常首選 .journal 文件直接訪問,因為它允許 rsyslogd 收集程序包含的其他欄位,否則在使用基於套接字的消息轉發時會失去這些欄位。)

如果您將“記錄器”指向不接受消息的 Unix 套接字,它實際上會顯示一條錯誤消息,如下所示:

$ python -c "from socket import *; socket(AF_UNIX, SOCK_DGRAM).bind('/tmp/log')"

$ logger -u /tmp/log Hello
logger: socket /tmp/log: Connection refused

引用自:https://serverfault.com/questions/1069377