繁体   English   中英

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

[英]How can I do structured logging?

是否有任何日志库允许对象的结构化日志记录,我的意思是,输出是结构化的形式,如JSON或XML?

在应用程序级别,我想使用简洁的语法(日志记录往往隐藏应用程序代码),例如

  1. logger.info("Deleting user", user)
  2. 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)));

有任何想法吗?

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

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

这是消息模板解决的问题空间。 Java中的serilogj实现如下:

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

其中@表示应将user属性作为结构化数据序列化到事件中。

即使没有序列化,消息模板也会生成具有一流语义属性的日志。 例如事件:

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

将产生一个事件,消息除以1和0 ,属性a = 1b = 0

暂无
暂无

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

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