背景
logger
是一個在Linux和Unix操作系統(tǒng)中使用的命令行工具抒和,可以直接向系本地syslog
文件或遠程Syslog服務器發(fā)送消息骗绕。logger
為寫日志提供了不同的選項,如設置優(yōu)先級、指定遠程系統(tǒng)或指定Syslog端口。在調試
rsyslog
收發(fā)功能的時候,突然出現(xiàn)logger
無法向本地及遠程任何地方發(fā)送消息的情況痪蝇,在對該問題的排查定位中使用的手段和思路,對于深入調查linux上同類問題有一定的參考價值冕房。
問題描述
常規(guī)使用躏啰,logger
無法給本地系統(tǒng)日志和遠端發(fā)送消息,無顯式報錯耙册,而在這之前能夠正常工作给僵。
具體復現(xiàn)如下:
logger -p local1.info "my name is Hanmeimei"
# -p, --priority priority_level觅玻,指定輸入消息的優(yōu)先級
# 在執(zhí)行命令后想际,本地的syslog收不到信息培漏;
排查與定位
首先排除rsyslog升級、配置等原因胡本,因為之前一直正常運行牌柄,沒人修改這些配置。
如果重啟該機器侧甫,可以立即解決這個問題珊佣,
logger -p local1.info "msg"
可以正常使用。重啟機器是一個重操作披粟,代價很大咒锻,一般不作首要處理方案,需要進一步定位原因守屉,減輕影響惑艇。我現(xiàn)在有3臺機器都出現(xiàn)這個問題,我重啟了2臺拇泛,留下一臺做對比研究使用(后分別稱作對照機與問題機)滨巴。
因為logger命令本身無法直接查看,沒有找到日志俺叭,暫無法追蹤恭取,要想其他辦法去查——了解到可以使用strace指令跟蹤logger命令的調用棧情況,如下:
-
執(zhí)行
strace -f logger -p local1.info "123"
strace
介紹:
顧名思義熄守,strace是一個可用于診斷蜈垮、調試和教學的Linux用戶空間跟蹤器。strace底層使用內核的ptrace特性來實現(xiàn)其功能裕照。
strace作為一種動態(tài)跟蹤工具攒发,能夠幫助運維高效地定位進程和服務故障。這里牍氛,-f 表示跟蹤由fork調用所產生的子進程晨继,后面跟的是原始命令烟阐。
分別獲取到對照機與問題機的上述指令的輸出搬俊。使用Compare或者IDEA進行內容的對比:
左側是對照機正常的輸出,右側是有問題的蜒茄。通過對比唉擂,兩個文件內容只有一處實質不同,即正常輸出比問題機多了一行內容②檀葛,而這一行就是實際要發(fā)送的內容(“123”)玩祟。
-
問題發(fā)生在①處,正常的這里返回了0屿聋,異常的這里返回-1空扎,(報錯...
-1 ECONNREFUSED (Connection refused)
)——因為連接被拒絕藏鹊,①處門都沒打開,當然也就沒有后面發(fā)送消息的②了转锈。
- 綜上盘寡,關鍵信息出現(xiàn)——指向了
/dev/log
,錯誤為:連接被拒絕撮慨!因此沒有成功發(fā)出消息竿痰。我們順藤摸瓜:這個/dev/log
是個特殊文件,它的屬性是srw-rw-rw-砌溺,s代表Unix domain socket
影涉,也稱為網絡套接字。
-
繼續(xù)追溯到
/dev/log
與systemd-journald.socket
有關系规伐。systemd-journald的補充:
systemd-journald
是一個收集并存儲各類日志數(shù)據(jù)的系統(tǒng)服務蟹倾。如果在啟動期間存在/var/log/journal/
目錄,那么日志將會被持久存儲在此目錄中猖闪, 否則將會臨時存儲在/run/log/journal/
目錄中(關機即丟失)喊式。以 "
.socket
" 為后綴的單元文件, 封裝了一個用于進程間通信的套接字(socket)或管道(FIFO)萧朝, 以支持基于套接字的啟動岔留。systemd-journald將監(jiān)聽以下這些套接字和路徑,在文件系統(tǒng)中可見:
/dev/kmsg, /dev/log, /run/systemd/journal/dev-log, /run/systemd/journal/socket, /run/systemd/journal/stdout
解決方案
使用systemctl restart systemd-journald.socket
重啟端口(并不是systemd-journald.service)检柬,僅此一步就可以解決問題献联,logger
能夠成功發(fā)送消息了。
注意:沒有重新啟動rsyslogd何址。
小結
本文通過strace
來跟蹤比較兩個執(zhí)行路徑里逆,直接獲取到了關鍵報錯,再據(jù)此線索解決問題用爪。此外原押,開啟rsyslog
的debug級別日志也許能看到更詳細的信息,但在可能的情況下strace
更利于發(fā)現(xiàn)問題的真相偎血。
在定位到/dev/log
之后問題被解決诸衔,但解決方案與socket“拒絕連接”的原因之間尚有鏈條缺失,由于測試環(huán)境已經銷毀颇玷,無法追蹤了笨农。有其他老師提到可能是system啟動的systemd-journald
與rsyslog sock
有沖突,導致rsyslog
套接字無法正常發(fā)送數(shù)據(jù)帖渠,但問題的概率特征與本文有出入谒亦。另有提及配置修改導致不記錄日志的現(xiàn)象,將/etc/systemd/journald.conf
中的配置ForwardToSyslog,修改為yes
即可(針對的是systemd-journald.service)份招。
對于/dev/log
丟失的情況切揭,論壇提到使用手動鏈接也可以:ln -s /run/systemd/journal/dev-log /dev/log
。