2017-08-25 67 views
1

我使用log4j的寫日誌到本地服務器的現有分佈式應用程序。我想保留現有的功能,並將一些日誌發送到中央存儲庫。我見過使用log4j的與SocketAppender發送日誌到遠程服務器的例子,但還沒有看到多個服務器發送到同一個遠程服務器在一個單獨的文件中寫入每臺服務器的日誌的例子。有沒有這樣的例子?Log4j和集中日誌收集

作爲替代,我很好奇使用使用一個數據庫作爲集中式日誌存儲庫中的JDBCAppender但對於如何做區分,其中從消息查看查詢結果時,傳來了同樣的問題。是否有log4j屬性設置來標識可以在偵聽器服務器上解釋的發件人?

回答

0

對於你的第一個問題 -它將取決於你的客戶端程序發送日誌的遠程服務器。如果您已經開發了一些程序,用於接收遠程服務器上的日誌然後,有2種方法來爲每個客戶端日誌單獨的日誌文件 -

  1. 服務器程序應該監聽某個端口上,並得到了一些記錄之後,應檢查客戶端IP,然後爲每個客戶端IP創建日誌文件。

  2. 使服務器程序偵聽不同的端口爲每個客戶端上,一旦客戶端連接到其指定的端口,接收數據,並在日誌文件中轉儲。這種方法看起來很簡單,但不推薦。

如果您的服務器是基於Linux,我會建議你使用rsyslog用於集中收集日誌。在rsyslog,您可以單獨配置每個客戶端和轉儲在單獨的日誌文件的日誌。

對於第二個問題 -你可以使用Log4j Nested diagnostic Context (NDC)功能在數據庫寫hostname。請參閱this示例。此示例將USER_ID用作寫入數據庫的額外列。同樣,您可以使用此額外列來編寫hostname。在寫入任何日誌語句之前,在您的客戶程序開始時,您必須使用以下代碼將值放入NDC -

NDC.push(InetAddress.getLocalHost().getHostName());