我需要将Log4j登录为二进制格式,以便日志可以轻松地进行机器解释。我知道我可以为此目的使用XML,但不希望相关的文件大小膨胀或解析开销。
整个布局系统似乎本质上是基于字符串的,这意味着我不能使用漂亮的文件滚动appender。 LoggingEvent是可序列化的,所以我想自己写一个二进制文件appender,但我觉得我不应该在这里开辟新的领域。
我错过了一些明显的东西吗?
答案 0 :(得分:6)
我最近遇到了一个非常类似的问题。我不得不将日志行写成二进制格式,但也想让所有其他的appender正常工作。
我所做的是实现我自己的appender,扩展AppenderSkeleton并获取getMessage()
对象,logger.info(LogEntry)
返回的消息是我自己的对象。
我还编写了一个实现LoggingEvent的类,它将调用appender的Layout类,以便将日志对象(我记录的对象)转换为字符串。
然后对于我自己的appender(没有布局),消息被序列化为二进制形式并写入某个字节流。对于其他appender,layout对象调用我的对象渲染器,并将消息序列化为String。
通过这种方式,所有常见的appender都可以正常工作,我仍然能够附加到我自己的格式。
摘要:
LogEntry
String
转换为BinaryFormatAppender
我不知道有任何现成的解决方案。
答案 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)
奇怪的是,文本是机器可读的。考虑只是将您的日志记录格式设置为易于解析的内容,最终将得到一个既可人也可机读的日志。