Linux

如何在 journalctl 之外分析 journalctl 日誌?

  • October 12, 2018

我需要從我的 systemd 日誌文件中收集一些統計資訊,例如有多少使用者將某個查詢字元串參數傳遞給我的服務。我知道我可以在 journalctl 中查看這些資訊,但我不知道如何在 Go(或 Python)中這樣做,以便我可以聚合數據。我一直在為此尋找一個庫,但似乎找不到任何東西,而且我無法弄清楚日誌文件的實際儲存位置。

您可以使用 Journal API 以程式方式訪問 systemd 日誌。

或者,您可能需要考慮在您的主機上執行 systemd-journal-gatewayd 服務,該服務通過 HTTP 伺服器導出日誌數據,在這種情況下,您可以使用另一種語言的 HTTP 客戶端實現直接查詢日誌。

期刊 API

官方 Journal API 作為 systemd 本身的一部分提供,用於實現 journalctl。這是一個 C API。

此 API 訪問由 systemd-journald 在下/var/log/journal/run/log/journal直接寫入的文件,因此您需要適當的權限才能從這些位置讀取,這通常意味著您需要以 root 身份執行程式碼。

此 API 還要求您連結到 systemd 庫並在執行時提供這些庫。您需要libsystemd-dev在 Ubuntu 18.04 系統上安裝該軟體包,以便能夠對其進行編譯和連結。

sudo apt-get install libsystemd-dev

您可以查看sd-journal(3)的手冊頁以了解此 API 的一般概述。有關查詢日誌的更具體情況,請參見sd_journal_next(3)(其中包括一個帶有完整簡單程序的好範例),以及sd_journal_add_match(3)以限制您獲得的匹配項(有效地實現日誌查詢。)您將還需要sd_journal_get_data(3)sd_journal_open(3)等,但希望這些指針能讓您開始直接訪問日誌。)

Python 綁定

官方 systemd 項目中有用於 systemd 的Python 綁定,其中包括 Journal API 的綁定。

這些模組也可作為 Ubuntu 18.04 軟體包提供,您可以使用以下方式安裝:

sudo apt-get install python3-systemd

…對於 Python 3(推薦),或者如果您仍然需要使用 Python 2,您可以使用:

sudo apt-get install python-systemd

請參閱程式碼 docstrings 上systemd.journal模組Reader類的文件。這門課讓你可以閱讀期刊,這可能是你感興趣的。

去綁定

github.com/coreos/go-systemd模組中有 systemd 庫的 Go 綁定。

查看用於從日誌中讀取的sdjournal子模組,尤其是JournalReader類型,包括用於過濾的匹配項。您可以從原始碼中找到有關它的更多資訊

期刊網關

使用 Journal API 直接訪問日誌文件的另一種方法是執行通過 HTTP 伺服器導出它們的服務。Systemd 通過systemd-journal-gatewayd提供這樣的服務。

該程序在 Ubuntu 18.04 上作為 systemd-journal-remote 軟體包的一部分提供,因此您可以使用以下方法安裝和啟用它:

sudo apt-get install systemd-journal-remote
sudo systemctl enable --now systemd-journal-gatewayd

這將在埠 19531 上導出一個 HTTP 伺服器,您可以使用它來瀏覽和查詢日誌。

在systemd-journal-gatewayd.service(8)的手冊頁上查看更多詳細資訊,其中包括一些如何使用 curl 訪問它的範例。您可以讓它使用自己的本機Journal Export Format導出數據,如 JSON 或類似 syslog 的純文字。

如果您使用 systemd-journal-gatewayd 路線,請確保您了解通過 HTTP 伺服器導出日誌數據的安全隱患。至少,請考慮僅在 localhost 上公開埠。

引用自:https://unix.stackexchange.com/questions/474383