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

Java 如何进行结构化日志记录?,java,logging,logback,slf4j,Java,Logging,Logback,Slf4j,是否有任何日志库允许对象的结构化日志记录,我的意思是,输出是结构化的,比如JSON或XML 在应用程序级别,我希望使用简洁的语法(日志记录往往会隐藏应用程序代码),例如 logger.info(“删除用户”,用户) logger.info(部分(“删除用户”,用户),部分(“帐户”,帐户),部分(“其他东西”,某些值)) 在日志文件级别,我得到结构良好的JSON(etc),元数据(线程、MDC、时间、级别等)作为信封,我自己的消息作为其中的结构化JSON对象,例如 "log" : { "ti

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

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

  • logger.info(“删除用户”,用户)
  • logger.info(部分(“删除用户”,用户),部分(“帐户”,帐户),部分(“其他东西”,某些值))
  • 在日志文件级别,我得到结构良好的JSON(etc),元数据(线程、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>
      }
    }
    

    有什么想法吗?

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

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

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

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

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

    Log.information("Deleting {@user}", user);
    
    其中,
    @
    表示应将
    用户
    属性作为结构化数据序列化到事件中

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

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

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

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

    Log.information("Deleting {@user}", user);
    
    其中,
    @
    表示应将
    用户
    属性作为结构化数据序列化到事件中

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

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

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

    尝试@DavidKerr您希望json字符串的结构与您的大厦一样?@MayankPandya这是一个开始,但它只将元数据放入json,而不会将我的对象结构化为json(我的示例json的“消息”部分)@DavidKerr你找到一个满意的选择了吗?干杯试试@DavidKerr你想把json字符串的结构和你的大厦一样吗?@MayankPandya这是一个开始,但它只把元数据转换成json,它不会把我的对象转换成json(我的样本json中的“消息”部分)。@DavidKerr你找到一个满意的选项了吗?干杯但我的对象只是一个普通的域对象POJO。默认情况下,他们的日志代码将只调用“toString”,但如果域对象实现(例如)“Loggable”,则其上的方法可以将域对象转换为JSON,但我的对象只是一个普通的域对象POJO。默认情况下,他们的日志代码将只调用“toString”,但如果域对象实现(例如)“Loggable”,则其上的方法可以将域对象转换为JSON