gpt4 book ai didi

java - 以编程方式创建 Log4j 2.x FileAppender

转载 作者:行者123 更新时间:2023-11-30 07:51:23 24 4
gpt4 key购买 nike

我想从 Log4j 1.2 迁移到 2.4。由于我在同一台计算机上运行程序的多个实例,因此我想在日志文件中包含一个 ID(在以下代码中称为 clientId)。因此我使用 Log4j 1.2 的方式以编程方式设置 FileAppender:

int clientId = ?// gets set before

FileAppender fa = new FileAppender();
fa.setName("FileLogger");
fa.setFile("logs/client_" + clientId + ".log");
fa.setLayout(new PatternLayout("%d %-5p %c{1} %m%n"));
fa.setThreshold(Level.INFO);
fa.setAppend(true);
fa.activateOptions();
Logger.getRootLogger().addAppender(fa);

我无法使用 Log4j 2.0 实现类似的效果,因为它们删除了直接修改这些属性的功能。相反,我尝试使用 CustomConfigurationFactory,如 https://logging.apache.org/log4j/2.x/manual/customconfig.html#Example 中所述。但我不明白我如何利用它?文档指出

This will cause the Configuration to automatically be hooked into Log4j when the LoggerContext is created.

我尝试过类似的方法:

LoggerContext context = (LoggerContext) LogManager.getContext(false);
context.getConfiguration(CustomConfigurationFactory.getInstance());

但这不起作用。

最佳答案

我自己发现的。我修改了工厂以使用 FileAppender:

    builder.setConfigurationName(name);
builder.setStatusLevel(Level.INFO);
builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL).
addAttribute("level", Level.INFO));
AppenderComponentBuilder appenderBuilder = builder.newAppender("file", "FILE").
addAttribute("fileName", "log/client_"+Config.CLIENTID+".log");
appenderBuilder.add(builder.newLayout("PatternLayout").
addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"));
appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.DENY,
Filter.Result.NEUTRAL).addAttribute("marker", "FLOW"));
builder.add(appenderBuilder);
builder.add(builder.newLogger("org.apache.logging.log4j", Level.INFO).
add(builder.newAppenderRef("file")).
addAttribute("additivity", false));
builder.add(builder.newRootLogger(Level.INFO).add(builder.newAppenderRef("file")));
return builder.build();

然后使用:

ConfigurationFactory.setConfigurationFactory(new CustomConfigurationFactory());
Logger log = LogManager.getLogger(Main.class.getName());

获取新的记录器

关于java - 以编程方式创建 Log4j 2.x FileAppender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33305672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com