如果沒有安裝或活動日誌記錄守護程序,記錄器生成的日誌會發生什麼情況
如果您的 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