Log4j不支持二进制日志格式?

时间:2011-04-11 18:00:54

标签: java log4j

我需要将Log4j登录为二进制格式,以便日志可以轻松地进行机器解释。我知道我可以为此目的使用XML,但不希望相关的文件大小膨胀或解析开销。

整个布局系统似乎本质上是基于字符串的,这意味着我不能使用漂亮的文件滚动appender。 LoggingEvent是可序列化的,所以我想自己写一个二进制文件appender,但我觉得我不应该在这里开辟新的领域。

我错过了一些明显的东西吗?

5 个答案:

答案 0 :(得分:6)

我最近遇到了一个非常类似的问题。我不得不将日志行写成二进制格式,但也想让所有其他的appender正常工作。

我所做的是实现我自己的appender,扩展AppenderSkeleton并获取getMessage()对象,logger.info(LogEntry)返回的消息是我自己的对象。

我还编写了一个实现LoggingEvent的类,它将调用appender的Layout类,以便将日志对象(我记录的对象)转换为字符串。

然后对于我自己的appender(没有布局),消息被序列化为二进制形式并写入某个字节流。对于其他appender,layout对象调用我的对象渲染器,并将消息序列化为String。

通过这种方式,所有常见的appender都可以正常工作,我仍然能够附加到我自己的格式。

摘要:

  • 以这种方式编写自己的日志记录对象:LogEntry
  • 实施 ObjectRenderer 以将String转换为BinaryFormatAppender
  • 使用我自己的{{1}}
  • 扩展 AppenderSkeleton

我不知道有任何现成的解决方案。

答案 1 :(得分:2)

我自己也遇到过类似的问题并使用JSON格式解决了这个问题,这种格式虽然仍然可以说比texttual更快,更容易处理。

在log4j.properties中,我设置了以下格式:

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

使其成为有效的JSON,而消息本身也是一个JSON对象,如:

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

在我的例子中,消息的内容是使用Jackson序列化器从Java对象创建的,如下所示:

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

生成的日志文件可以处理任何理解JSON的问题,只需将其包装到

 [ <<file contents>>, {}]

答案 2 :(得分:1)

log4j发布中没有任何内容。

您可以查看http://sourceforge.net/projects/bclf/,但最终可能会编写自己的Appender并实现doAppend(LogginEvent)。

答案 3 :(得分:0)

只要日志是“常规”,那么机器可以很容易地解析正则表达式。如果您担心大小和XML,可以压缩日志。

答案 4 :(得分:0)

奇怪的是,文本是机器可读的。考虑只是将您的日志记录格式设置为易于解析的内容,最终将得到一个既可人也可机读的日志。