2011-04-11 68 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>>, {}]