對於更難發現的問題,rsyslog具有集成的調試支持。通常,這不是發現配置問題所必需的,而是用來尋找程序或插件錯誤的。但是,在許多情況下,事實證明調試日志對於發現配置問題很有幫助。
一個快速指南可以在這里找到。
支持的信號
SIGUSR1-打開和關閉調試消息。請注意,要使此信號起作用,rsyslogd必須通過-d命令行開關或以下指定的環境選項在啟用調試的情況下運行。它不要求rsyslog現在帶調試啟用(但根據設定的不同,這可能導致更好的調試信息)。
注意:此信號在以后的發行版中可能會消失,並可能被其他內容代替。
環境變量
有兩個環境變量可設置多個調試設置:
-
除了標准輸出外,“ RSYSLOG_DEBUGLOG”(示例:RSYSLOG_DEBUGLOG =“ / path / to / debuglog / debug.log”)會將(幾乎)所有調試消息寫入(指定)日志文件。某些系統消息(例如segfault或中止消息)未寫入文件,因為我們無法捕獲它們。
-
運行時調試支持由“ RSYSLOG_DEBUG”控制。
“ RSYSLOG_DEBUG”環境變量包含一個選項字符串,其中可能包含以下選項(均不區分大小寫):
- LogFuncFlow-打印出功能的邏輯流程(輸入和退出它們)
- FileTrace-指定要跟蹤LogFuncFlow的文件。如果未設置(默認設置),則為所有文件提供LogFuncFlow跟蹤。設置為將其限制為指定的文件。可以多次指定FileTrace,每個文件指定一個(例如,導出RSYSLOG_DEBUG =“ LogFuncFlow FileTrace = vm.c FileTrace = expr.c”
- PrintFuncDB-打印調試信息時(例如中止情況),打印調試功能數據庫的內容!
- PrintAllDebugInfoOnExit-在rsyslogd退出之前立即打印所有調試信息(當前未實現!)
- PrintMutexAction-在發生互斥操作時將其打印出來。查找僵局等有用。
- NoLogTimeStamp-不為日志行添加時間戳(默認是這樣做的)。
- NoStdOut-不向標准輸出發出調試消息。如果未設置RSYSLOG_DEBUGLOG,則意味着將完全不顯示任何消息。
- 調試 -如果存在,則打開調試系統並啟用調試輸出
- DebugOnDemand-如果存在,則打開調試系統,但本身不會啟用調試輸出。您需要發送SIGUSR1以在需要時將其打開。
- OutputTidToStderr-如果存在,則使rsyslog將有關新創建進程的線程ID(tid)的信息輸出到stderr。注意不一定報告所有新線程(取決於代碼,例如插件的代碼)。僅在Linux下可用。當特權被丟棄時,這通常不起作用(這不是錯誤,而是錯誤的方式)。
- 幫助 -顯示非常簡短的命令列表-如果您無法訪問文檔,希望可以節省生命…
各個選項之間用空格隔開。
其中DebugOnDemand比較適用於在線調試.
為什么要使用環境變量?
您可能會問為什么我們將環境變量用於調試系統參數,而不是通常的rsyslog.conf配置命令。畢竟,環境變量迫使人們更改發行版特定的配置文件,而常規配置指令恰好適合一個中央rsyslog.conf。
歷史上,環境變量對於初始化所謂的“ rtinst”模式是必需的。隨着OS工具的改進,此模式不再存在。使用環境變量仍然具有rsyslogd初始化就可以正常工作的好處。最重要的是,這是在讀取rsyslog.conf之前。
如果沒問題,則可以使用rsyslog.conf全局語句來啟用調試模式並提供一些設置。
但是,如果您很難使用環境變量來設置調試指令,則可以使用一種解決方法,將在下一段中進行介紹。
通過rsyslog.conf啟用調試
如前一段所述,通過rsyslog.conf啟用調試可能無法滿足某些調試需求,但是基本的調試輸出將起作用-這是最常需要的。可用的選項有限,但是這些選項涵蓋了最重要的用例。
調試處理是通過舊版配置語句完成的。當前尚無計划將其移至v6 +配置系統。可用的設置是
- $DebugFile <文件名>-設置調試文件名
- $DebugLevel <0 | 1 | 2>-設置各自的調試級別,其中0表示調試關閉,1是按需激活的調試(但調試模式已關閉),2是完全調試模式。
請注意,從理論上講,禁止多次指定這些參數。但是,我們不強制執行此操作,如果發生這種情況,則結果不確定。
從正在運行的實例獲取調試信息
可以從正在運行的實例中獲取調試信息,但這需要進行一些設置。我們假定實例在后台運行,因此不希望將調試輸出輸出到stdout。這樣,所有調試信息都需要放入日志文件中。
要創建此設置,您需要
- 將RSYSLOG_DEBUGLOG環境變量指向在while運行時可以訪問的文件(強烈建議在本地文件系統中使用該文件!)
- 將RSYSLOG_DEBUG至少設置為“ DebugOnDeman NoStdOut”
- 如果不以交互方式運行rsyslogd,請確保在正確的(特定於發行版的)啟動腳本中設置了這些環境變量
這些設置使您能夠對SIGUSR1做出反應。收到后,該信號將切換調試狀態。因此,發送一次以打開調試日志記錄,然后再次發送以再次關閉調試日志記錄。第三次,它將再次打開……等等。
在典型的系統上,可以向rsyslogd發送以下信號:
kill -USR1 $(cat /var/run/rsyslogd.pid)
調試日志將顯示調試日志記錄是打開還是關閉。沒有其他狀態指示。
注意:實際上,使用DebugOnDemand本身運行不會帶來任何性能損失。但是,打開調試日志記錄會嚴重影響性能。此外,調試日志記錄將同步許多代碼,從而消除了很多並發性,從而消除了潛在的競爭條件。因此,打開和關閉調試日志記錄時,同一運行實例的行為可能會大不相同。按需調試日志功能被認為對分析僅在長時間運行后才發現的難以發現的錯誤非常有價值。在失敗的實例上打開調試日志記錄可能會揭示失敗的原因。但是,取決於失敗,調試日志記錄甚至可能無法成功打開。另請注意,使用此rsyslog版本,我們無法獲取有關之前發生的事件的任何調試信息。 調試日志記錄已打開。
分析日志
調試日志主要用於rsyslog開發人員。但是它們仍然可以為用戶提供有價值的信息。請注意,日志有時包含看起來像錯誤的信息,但實際上沒有。我們在日志中添加了很多額外的信息,並且在某些情況下發生錯誤是可以的,我們只是想將其記錄在日志中。該代碼自動處理許多情況。因此,簡而言之,該日志對您可能沒有意義,但(希望)對開發人員來說有意義。請注意,我們的開發人員經常需要日志文件的許多行,僅通過查看幾個(一百個)日志記錄就可以診斷出問題,這一點相對很少見。
安全風險
調試日志將向任何能夠讀取日志文件的人透露潛在的明智信息,包括用戶帳戶和密碼。因此,建議適當保護對日志文件的訪問。而且,啟用了調試日志的實例的運行速度比沒有實例運行的實例要慢得多。攻擊者可能使用此工具進行拒絕服務攻擊或嘗試從日志文件中隱藏某些信息。因此,建議僅出於某種原因啟用DebugOnDemand模式。請注意,當未啟用任何調試模式時,SIGUSR1將被完全忽略。
當以任何調試模式(包括按需模式)運行時,可以通過按ctl-c中止rsyslogd的交互式實例。
持續調試輸出
在rsyslog.conf文件的開頭添加以下權限。這將確保在啟動rsyslog服務時首先啟用調試支持:
$DebugFile /var/log/rsyslog.debug
$DebugLevel 2
如果需要,可以更改實際的文件路徑和名稱。
完成上述設置后,重新啟動rsyslog時,它將產生一個連續的調試文件。
按需調試
為了使rsyslog准備創建調試日志(又名Debug on Demand),設置有所不同。
$DebugFile /var/log/rsyslog.debug
$DebugLevel 1
現在,rsyslog不會在重新啟動時創建調試日志,而是等待對pid的USR信號。發送后,將觸發調試輸出。再次發送時,調試輸出將停止。
kill -USR1`cat / var / run / rsyslogd.pid`
注意事項
- 啟用調試輸出后,調試文件將快速增長。確保沒有永久啟用它。該文件最終將填滿磁盤。
- 調試模式不應在生產環境中用作永久設置。它將影響處理和性能。
參考:
https://www.rsyslog.com/doc/v8-stable/troubleshooting/debug.html#signals-supported