繁体   English   中英

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

[英]Log4j has no support for binary logging format?

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

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

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

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

我所做的是实现我自己的appender,它扩展了AppenderSkeleton并获取了LoggingEvent对象,其中getMessage()返回的消息是我自己的对象。

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

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

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

综上所述:

  • 使用这种方式编写自己的日志记录对象: logger.info(LogEntry)
  • 实现ObjectRendererLogEntry转换为String
  • 使用我自己的BinaryFormatAppender扩展AppenderSkeleton

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

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

在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>>, {}]

log4j发行版中没有任何内容。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM