编程自定义json布局log4j2

hlswsv35  于 2021-08-20  发布在  Java
关注(0)|答案(0)|浏览(293)

我有 Java 利用 Log4j2 framework. 使用自定义参数记录异常或信息时使用json结构。出于这个原因,我正在尝试以编程方式配置log4j2。我知道建议使用基于文件的配置,但似乎最好以编程方式为我的案例初始化框架。
这就是我试图建立的结构。
自定义json布局 HttpAppender 这将通过http发送日志
如果httpappender失败,它将使用 JdbcAppender 写入数据库
如果jdbcappender失败,它将使用 FileAppender 写入日志文件
我能够生成 JsonLayout 但我不能添加自定义字段,也不能从默认结构中删除现有字段。我可能查阅了50多篇文章/问题,但没有一篇对我有用。这是我目前的代码。

public static void initializeLogger() 
    {
       ConfigurationBuilder<BuiltConfiguration> builder = 
               ConfigurationBuilderFactory.newConfigurationBuilder();

       builder.setStatusLevel(Level.DEBUG);
       builder.setConfigurationName("DefaultLogger");

       //Creating console appender just to see logging is there.
       AppenderComponentBuilder appenderBuilder = builder.newAppender("Console", "CONSOLE")
            .addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
       appenderBuilder.add(builder.newLayout("PatternLayout")
            .addAttribute("pattern", pattern)
            .addAttribute("AdditionalField.key", "asd")
            .addAttribute("AdditionalField.value", "qwe"));
       RootLoggerComponentBuilder rootLogger = builder.newRootLogger(Level.DEBUG);
       rootLogger.add(builder.newAppenderRef("Console"));

       builder.add(appenderBuilder);

       //Creating the file appender
       LayoutComponentBuilder layoutBuilder = builder.newLayout("JsonLayout")
            .addAttribute("compact", "false")
            .addAttribute("AdditionalField", builder.newKeyValuePair("asd", "qwe"));

       ComponentBuilder triggeringPolicy = builder.newComponent("Policies")
            .addComponent(builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", "1KB"));
       appenderBuilder = builder.newAppender("LogToRollingFile", "RollingFile")
            .addAttribute("fileName", fileName)
            .addAttribute("filePattern", "applog-%d{MM-dd-yy-HH-mm-ss}.log.")
            .add(layoutBuilder)
            .addComponent(triggeringPolicy);
       builder.add(appenderBuilder);

       rootLogger.add(builder.newAppenderRef("LogToRollingFile"));
       builder.add(rootLogger);

       Configurator.reconfigure(builder.build());
}

这段代码打印到控制台,并将json格式的日志写入文件。自定义值不会添加到json中。我试图通过它的 builder 但我无法将其添加到生成器本身。

//Probably creating a new layout instance with additional fields
//might be helpful but I cannot use this in the builder above.
JsonLayout layout = JsonLayout.newBuilder()
    .setAdditionalFields(new KeyValuePair [] {
         new KeyValuePair("asd", "qwe"),
         new KeyValuePair("zxc", "rty"),
     }).build();

我需要添加到json的参数是动态的,我不知道自定义节点的键和值。在这个阶段,我尝试在将其写入文件时创建一个自定义json布局。
我可能是做得完全错误,所以请建议!我愿意接受建议。谢谢

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题