Java 如何将字段添加到log4j2';s JSON日志

Java 如何将字段添加到log4j2';s JSON日志,java,json,log4j2,Java,Json,Log4j2,假设我有一个标准的JSON日志,如下面文档中的示例所示 现在我想将自定义信息添加到此日志,如下所示: { "logger":"com.foo.Bar", "timestamp":"1376681196470", "level":"INFO", "thread":"main", "message":"Message flushed with immediate flush=true", "extrainformation":"Some very im

假设我有一个标准的JSON日志,如下面文档中的示例所示

现在我想将自定义信息添加到此日志,如下所示:

{
    "logger":"com.foo.Bar",
    "timestamp":"1376681196470",
    "level":"INFO",
    "thread":"main",
    "message":"Message flushed with immediate flush=true",
    "extrainformation":"Some very important stuff I need to include",
    "extrainformation2":"Some other very important stuff I need to include"
}
有办法做到这一点吗?文档似乎没有提到任何关于向日志对象添加属性的内容。我是否需要自定义布局或以编程方式添加字段或什么


就像@alan7678所说的-

自定义布局也是我的解决方案

@Plugin(name = "ExtendedJsonLayout", category = Node.CATEGORY, 
    elementType = Layout.ELEMENT_TYPE, printObject = true)
public class ExtendedJsonLayout extends AbstractJacksonLayout {

// Lots of code!
}
我创建了一个名为“ExtendedJSonLayout”的Log4j2布局插件。您可以将其包含在Maven或Gradle的项目中。看看这里-


只需通过配置文件归档即可

请参阅我的log4j2.yaml:

Configuration:
  status: warn
  appenders:
    Console:
      name: STDOUT
      JsonLayout:
        complete: false
        compact: true
        eventEol: true
        KeyValuePair:
          -
            key: extrainformation
            value: Some very important stuff I need to include
          -
            key: extrainformation2
            value: Some other very important stuff I need to include

  Loggers:
    Root:
      level: "warn"
      AppenderRef:
        ref: STDOUT

自定义字段总是最后一个,按声明顺序排列。这些值支持

我认为创建自定义布局插件是您需要做的。您可以根据需要使用布局设置打印消息的格式。剩下的是从LogEvent/消息中检索数据的问题,我很担心。我从来没有写过插件。我想是学习的好时机。谢谢如何在Maven中进行同样的配置?尽管上面的配置文件独立于Maven或gradle,但您可以在这里找到说明:如果我们不总是需要这些值怎么办?如何有条件地添加它们。因为默认情况下,它们将显示在每个日志行中。我不知道单独通过配置文件解决问题的任何方法。您可能需要通过代码深入研究解决方案。但是您确定这是一个有效的用例,绝对必要,而且花费了大量精力吗?自定义字段的值是动态的还是
getMixedFields()
方法在应用程序启动时只调用一次?
getMixedFields()
在每个日志事件上都被调用,因此它可以是动态的。但这可能会很棘手,这取决于您希望从中获取值的上下文。它能与log4j2v2.21一起工作吗?自述文件提到了2.8和2.9。
Configuration:
  status: warn
  appenders:
    Console:
      name: STDOUT
      JsonLayout:
        complete: false
        compact: true
        eventEol: true
        KeyValuePair:
          -
            key: extrainformation
            value: Some very important stuff I need to include
          -
            key: extrainformation2
            value: Some other very important stuff I need to include

  Loggers:
    Root:
      level: "warn"
      AppenderRef:
        ref: STDOUT