java 如何进行结构化日志记录?

gz5pxeao  于 5个月前  发布在  Java
关注(0)|答案(3)|浏览(51)

是否有任何日志库允许对象的结构化日志记录,我的意思是,输出是以结构化的形式,如JSON或XML?
在应用程序级别,我希望使用简洁的语法(日志记录往往会隐藏应用程序代码),例如
1.第一个月

  1. logger.info(part("Deleting user", user), part("Account", account), part("Something else", someValue));
    在日志文件级别,我得到了结构良好的JSON(等),元数据(线程,MDC,时间,级别等)作为信封,我自己的消息作为其中的结构化JSON对象,例如。
"log" : {
  "time": <timestamp>,
  "level": "INFO",
  "thread": <thread-name>,
  "MDC": [MDC info added by application code],
  etc...
  "message": {
    "Message": "Deleting User",
    "User": <JSON object of the user serialised>
  }
}

字符串
当然,它不需要漂亮地打印在日志文件中。
如果域对象(例如User)可以实现一个Loggable接口,该接口具有序列化不同日志级别的状态的方法,例如

  1. INFO级别给出了一个摘要
  2. DEBUG级别递归地提供更多、更深入的数据
  • 一些日志聚合器可以在语义级别上理解日志。日志格式一致,允许搜索等。*

我已经,在过去,实现了几个函数,让我的一部分方式,以确保键/值对格式化,但这并不给予我想要的一切.这工作,规范化键/值,格式化值,突出空值,等等,但它不发出JSON,不能委托对象格式化:-

logger.info(logString(part("Deleting user", user), part("Account", account), part("Something else", someValue)));


有什么想法吗?

mqxuamgl

mqxuamgl1#

这是message templates解决的问题空间。Java中的serilogj实现如下所示:

Log.information("Deleting {@user}", user);

字符串
其中@表示user属性应该作为结构化数据序列化到事件中。
即使没有序列化,消息模板也会生成具有一流语义属性的日志。例如事件:

Log.information("Dividing {a} by {b}", 1, 0);


将生成一个带有消息 * 1除以0* 和属性a = 1b = 0的事件。

ylamdve6

ylamdve62#

查看https://github.com/savoirtech/slf4j-json-logger
用法示例(为可读性格式化输出)

logger.trace()
    .message("Report executed")
    .map("someStats", map)
    .list("customers", list)
    .field("year", "2016")
    .log();

个字符
这个项目有点老了,虽然,它的最新提交是从2017年。我不属于这个项目,我没有使用过它,所以我不知道这个工作得怎么样。

cwxwcias

cwxwcias3#

您可以使用JSONObject.toString()方法在logcat上打印JSON。

Log.d("tag", jsonObject.toString(4));

字符串

相关问题