2011-04-11 39 views
7

我需要將Log4j日誌記錄爲二進制格式,以便日誌可以輕鬆地通過機器解釋。我知道我可以將XML用於此目的,但不希望關聯的文件大小膨脹或解析開銷。Log4j不支持二進制日誌格式?

整個佈局系統似乎固有地基於字符串,這意味着我不能使用漂亮的文件滾動appender。 LoggingEvent是可序列化的,所以我正在考慮自己編寫一個二進制文件appender,但是我覺得我不應該在這裏創新。

我錯過了一些明顯的東西嗎?

回答

1

log4j發行版中沒有任何內容。

你可以看看http://sourceforge.net/projects/bclf/,但你最終可能會編寫自己的Appender並實現doAppend(LogginEvent)。

+0

是的,我最終寫了自己的 - 很高興我沒有錯過任何明顯的東西。 – CarlG 2011-04-11 20:24:51

0

只要日誌是「常規」的,那麼機器就可以很容易地解析正則表達式。如果您擔心尺寸和XML,則可以壓縮日誌。

6

我最近有一個非常類似的問題。我不得不將日誌行寫入二進制格式,但也希望所有其他appender正常工作。

我所做的是實現我自己的appender,它擴展了AppenderSkeleton並採用LoggingEvent對象,其中由getMessage()返回的消息是我自己的對象。

我還寫了一個實現ObjectRenderer的類,其中appender的Layout類將調用以便將日誌記錄對象(我記錄的那個)轉換爲字符串。

然後,對於我自己的appender(沒有佈局),消息被序列化爲二進制格式並寫入一些字節流。對於其他appender,佈局對象調用我的對象渲染器,並將消息序列化爲String。

通過這種方式,所有常見的appender的工作原理都相同,我仍然可以追加到我自己的格式。

總結:

  • 寫自己的日誌記錄對象這樣使用:logger.info(LogEntry)
  • 實施ObjectRenderer改造LogEntryString
  • 擴展AppenderSkeleton我自己BinaryFormatAppender

我不知道任何現成的解決方案。

0

奇怪的是,文本是機器可讀的。考慮將日誌記錄格式設置爲易於解析的內容,並且最終會生成一個人機交互的日誌。

+0

我已經有一個人類可讀(文本)版本的日誌。對於我所做的,二進制表示的讀取和緊湊性是一個優勢。 – CarlG 2011-04-11 20:25:56

2

我自己也有類似的問題,並通過使用JSON格式解決了這個問題,雖然texttual比XML更快,更容易處理。

在log4j中。性能,我設置以下格式:

log4j.appender.A1.layout.ConversionPattern = {"time":"%d", "msg": %m},%n 

這使得有效的JSON,而信息本身是一個JSON對象,以及,像:

myLogger.info("{...the contents of the object...}") 

在我的情況下的消息的內容是用傑克遜串行從Java對象創建的,就像這樣:

static ObjectMapper MAPPER= new ObjectMapper(); 
MAPPER.writeValueAsString(myObject); 

生成的日誌文件可以與瞭解JSON的任何問題進行處理,它只是需要被包裝成

[ <<file contents>>, {}]