分享方式:


Linux 的 Azure 監視器的 Syslog 疑難排解指南

警告

本文參考 CentOS,這是處於終止服務 (EOL) 狀態的 Linux 發行版。 請據此考慮您的使用方式和規劃。 如需詳細資訊,請參閱 CentOS 生命週期結束指導

適用於 Linux Syslog 的 Azure 監視器代理程式集合和支援 RFC 標準的概觀:

  • Azure 監視器代理程式會在安裝程序期間安裝系統 syslog 精靈的輸出組態。 組態檔會指定事件在 syslog 精靈與 Azure 監視器代理程式之間流動的方式。
  • 針對 rsyslog (大部分的 Linux 發行版本),組態檔為 /etc/rsyslog.d/10-azuremonitoragent-omfwd.conf。 針對 syslog-ng,組態檔為 /etc/syslog-ng/conf.d/azuremonitoragent-tcp.conf
  • Azure 監視器代理程式會接聽 TCP 連接埠,以從 rsyslog / syslog-ng接收事件。 此通訊的連接埠會記錄在 /etc/opt/microsoft/azuremonitoragent/config-cache/syslog.port

    注意

    在 Azure 監視器代理程式 1.28 版之前,這會使用 Unix 網域套接字,而不是 TCP 連接埠,從 rsyslog 接收事件。 omfwd rsyslog 中的輸出模組提供多任務緩衝處理和重試機制,以改善可靠性。

  • 當 Azure 監視器代理程式擷取延遲或無法連線到 Azure 監視器代理程式時,Syslog 精靈會使用佇列。
  • Azure 監視器代理程式會透過上述通訊端擷取 syslog 事件,並根據 /etc/opt/microsoft/azuremonitoragent/config-cache/configchunks/ 中資料收集規則 (DCR) 組態中的設備或嚴重性組合對這些事件進行篩選。 DCR 中不存在的任何 facilityseverity 項目都會遭到捨棄。
  • Azure 監視器代理程式會嘗試根據 RFC3164RFC5424 來剖析事件。 它也知道如何剖析 此網站 中列出的訊息格式。
  • Azure 監視器代理程式會從 DCR 組態識別 Syslog 事件的目的地端點,並嘗試上傳事件。

    注意

    Azure 監視器代理程序預設會使用本機持續性。 從 rsyslogsyslog-ng 接收的所有事件,如果無法上傳,則會在 /var/opt/microsoft/azuremonitoragent/events 中排入佇列。

問題

您可能遇到下列問題。

Rsyslog 資料不會上傳,因為適用於 Linux 的 Azure 監視器代理程式發生完整的磁碟空間問題

後續各節描述物ㄊㄧㄣˊ。

徵兆

Syslog 資料未上傳:在 /var/opt/microsoft/azuremonitoragent/log/mdsd.err 檢查錯誤記錄檔時,您會看到與下列程式碼片段類似、關於在將項目插入本地持續性存放區時發生錯誤...裝置上沒有剩餘空間的項目:

2021-11-23T18:15:10.9712760Z: Error while inserting item to Local persistent store syslog.error: IO error: No space left on device: While appending to file: /var/opt/microsoft/azuremonitoragent/events/syslog.error/000555.log: No space left on device

原因

適用於 Linux 的 Azure 監視器代理程式會在擷取之前 /var/opt/microsoft/azuremonitoragent/events 緩衝事件。 在預設的適用於 Linux 的 Azure 監視器代理程式安裝上,此目錄會在閒置時佔用約 650 MB 的磁碟空間。 在持續記錄負載下,磁碟上的大小繪增加。 其大約每隔 60 秒清除一次,並在負載回到閒置時減少至 ~650 MB。

確認磁碟已滿問題

df 命令顯示 /dev/sda1 上幾乎沒有可用空間,如下列輸出所示。 請注意,您應該檢查與記錄目錄相互關聯的明細項目 (例如, /var/log/var/)。

   df -h
Filesystem Size  Used Avail Use% Mounted on
udev        63G     0   63G   0% /dev
tmpfs       13G  720K   13G   1% /run
/dev/sda1   29G   29G  481M  99% /
tmpfs       63G     0   63G   0% /dev/shm
tmpfs      5.0M     0  5.0M   0% /run/lock
tmpfs       63G     0   63G   0% /sys/fs/cgroup
/dev/sda15 105M  4.4M  100M   5% /boot/efi
/dev/sdb1  251G   61M  239G   1% /mnt
tmpfs       13G     0   13G   0% /run/user/1000

您可使用 du 命令來檢查磁碟,以判斷哪些檔案造成磁碟已滿。 例如:

   cd /var/log
   du -h syslog*
6.7G    syslog
18G     syslog.1

在某些情況下,du 可能不會報告任何大型檔案或目錄。 標示為 (已刪除) 檔案可能會佔用空間。 當某些其他程序嘗試刪除檔案時,就會發生此問題,但具有該檔案的程序仍會開啟狀態。 您可使用 lsof 命令來檢查這類檔案。 在下方範例中,我們看到 /var/log/syslog 標示為已刪除,但其佔用 3.6 GB 的磁碟空間。 其尚未刪除,因為具有 PID 1484 的程序仍然開啟該檔案。

   sudo lsof +L1
COMMAND   PID   USER   FD   TYPE DEVICE   SIZE/OFF NLINK  NODE NAME
none      849   root  txt    REG    0,1       8632     0 16764 / (deleted)
rsyslogd 1484 syslog   14w   REG    8,1 3601566564     0 35280 /var/log/syslog (deleted)

Rsyslog 預設設定會將所有設施記錄到 /var/log/

在某些熱門散發版本 (例如 Ubuntu 18.04 LTS),rsyslog 隨附預設設定檔 (/etc/rsyslog.d/50-default.conf),這會將幾乎所有設施中的事件記錄到位於 /var/log/syslog 的磁碟。 RedHat/CentOS 系列 Syslog 事件會儲存在 /var/log/ 底下,但儲存在不同的檔案中:/var/log/messages

Azure 監視器代理程式不依賴正在記錄至 /var/log/ 的 Syslog 事件。 相反地,其會將 rsyslog 服務設定為透過 TCP 通訊埠,將事件直接轉送至 azuremonitoragent 服務程序 (mdsd)。

修正:從 /etc/rsyslog.d/50-default.conf 移除大量設施

如果您要透過 rsyslog 傳送大量的記錄磁碟區,且系統已設定為記錄這些設施的事件,請考慮修改預設 rsyslog 組態以避免記錄,並將其儲存在 /var/log/ 下。 此設施的事件仍會轉送至 Azure 監視器代理程式,因為 rsyslog 會使用不同的組態來轉送放在 /etc/rsyslog.d/10-azuremonitoragent-omfwd.conf 中。

  1. 例如,若要在 /var/log/syslog/var/log/messages 的記錄中移除 local4 事件,請從下列位置變更 /etc/rsyslog.d/50-default.conf 中的此行:

    *.*;auth,authpriv.none          -/var/log/syslog
    

    針對此程式碼片段 (新增 local4.none;):

    *.*;local4.none;auth,authpriv.none          -/var/log/syslog
    
  2. sudo systemctl restart rsyslog