我需要將Log4j日誌記錄爲二進制格式,以便日誌可以輕鬆地通過機器解釋。我知道我可以將XML用於此目的,但不希望關聯的文件大小膨脹或解析開銷。Log4j不支持二進制日誌格式?
整個佈局系統似乎固有地基於字符串,這意味着我不能使用漂亮的文件滾動appender。 LoggingEvent是可序列化的,所以我正在考慮自己編寫一個二進制文件appender,但是我覺得我不應該在這裏創新。
我錯過了一些明顯的東西嗎?
我需要將Log4j日誌記錄爲二進制格式,以便日誌可以輕鬆地通過機器解釋。我知道我可以將XML用於此目的,但不希望關聯的文件大小膨脹或解析開銷。Log4j不支持二進制日誌格式?
整個佈局系統似乎固有地基於字符串,這意味着我不能使用漂亮的文件滾動appender。 LoggingEvent是可序列化的,所以我正在考慮自己編寫一個二進制文件appender,但是我覺得我不應該在這裏創新。
我錯過了一些明顯的東西嗎?
log4j發行版中沒有任何內容。
你可以看看http://sourceforge.net/projects/bclf/,但你最終可能會編寫自己的Appender並實現doAppend(LogginEvent)。
只要日誌是「常規」的,那麼機器就可以很容易地解析正則表達式。如果您擔心尺寸和XML,則可以壓縮日誌。
我最近有一個非常類似的問題。我不得不將日誌行寫入二進制格式,但也希望所有其他appender正常工作。
我所做的是實現我自己的appender,它擴展了AppenderSkeleton並採用LoggingEvent對象,其中由getMessage()
返回的消息是我自己的對象。
我還寫了一個實現ObjectRenderer的類,其中appender的Layout類將調用以便將日誌記錄對象(我記錄的那個)轉換爲字符串。
然後,對於我自己的appender(沒有佈局),消息被序列化爲二進制格式並寫入一些字節流。對於其他appender,佈局對象調用我的對象渲染器,並將消息序列化爲String。
通過這種方式,所有常見的appender的工作原理都相同,我仍然可以追加到我自己的格式。
總結:
logger.info(LogEntry)
LogEntry
到String
BinaryFormatAppender
我不知道任何現成的解決方案。
奇怪的是,文本是機器可讀的。考慮將日誌記錄格式設置爲易於解析的內容,並且最終會生成一個人機交互的日誌。
我已經有一個人類可讀(文本)版本的日誌。對於我所做的,二進制表示的讀取和緊湊性是一個優勢。 – CarlG 2011-04-11 20:25:56
我自己也有類似的問題,並通過使用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>>, {}]
是的,我最終寫了自己的 - 很高興我沒有錯過任何明顯的東西。 – CarlG 2011-04-11 20:24:51