我需要将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