【发布时间】:2021-07-08 14:30:57
【问题描述】:
我有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 创建 JsonLayout,但无法将其添加到构建器本身。
//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 布局。
我可能做错了,所以请指教!我愿意接受建议。 谢谢。
【问题讨论】: