与log4j Java配置有关的问题
我一直在用Java配置log4j2时遇到问题。与log4j Java配置有关的问题
我有一个工作的XML配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="DEBUG">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level - %msg%n" />
</Console>
<File name="DM_PREPUB" fileName="logs/41_2015/DM_PREPUB.log">
<MarkerFilter marker="DM_PREPUB" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout>
<pattern>%d %p %C{10} [%t] %m%n</pattern>
</PatternLayout>
</File>
<File name="BACKUP" fileName="logs/41_2015/BACKUP.log">
<MarkerFilter marker="BACKUP" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout>
<pattern>%d %p %C{10} [%t] %m%n</pattern>
</PatternLayout>
</File>
</appenders>
<loggers>
<logger name="foo.bar" level="DEBUG">
<appender-ref ref="DM_PREPUB" />
<appender-ref ref="BACKUP" />
</logger>
<root level="ALL">
<appender-ref ref="Console" />
</root>
</loggers>
</configuration>
正如你所看到的,这个配置创建了相应的标记两种文件追加程序。非常简单。
我试图在Java中实现相同的配置,但没有运气:
ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
builder.setStatusLevel(org.apache.logging.log4j.Level.ALL);
builder.setConfigurationName("DMWorkflow");
builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL).addAttribute("level", org.apache.logging.log4j.Level.DEBUG));
// console appender
AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE").addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern", "%d{HH:mm:ss.SSS} [%t] %-5level - %msg%n"));
builder.add(appenderBuilder);
// main log appender
appenderBuilder = builder.newAppender("DM_PREPUB" /*appender name*/, "FILE" /*appender type*/)
.addAttribute("fileName", "logs/41_2015/DM_PREPUB.log");
appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern", "%d %p %C{10} [%t] %m%n"));
appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.ACCEPT, Filter.Result.DENY).addAttribute("marker", "DM_PREPUB"));
builder.add(appenderBuilder);
// step appenders
appenderBuilder = builder.newAppender("BACKUP" /*appender name*/, "FILE" /*appender type*/)
.addAttribute("fileName", "logs/41_2015/BACKUP.log");
appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern", "%d %p %C{10} [%t] %m%n"));
appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.ACCEPT, Filter.Result.DENY).addAttribute("marker", "BACKUP"));
builder.add(appenderBuilder);
// main logger
LoggerComponentBuilder componentBuilder = builder.newLogger("foo.bar", org.apache.logging.log4j.Level.DEBUG).add(builder.newAppenderRef("DM_PREPUB"));
// step loggers
componentBuilder.add(builder.newAppenderRef("BACKUP"));
builder.add(componentBuilder);
builder.add(builder.newRootLogger(org.apache.logging.log4j.Level.ALL).add(builder.newAppenderRef("Stdout")));
Configurator.initialize(builder.build());
在这两种情况下,我实例化的记录是这样的:
logger = LogManager.getLogger("foo.bar");
globalMarker = MarkerManager.getMarker("DM_PREPUB");
Java的配置代码不看起来很复杂,这就是为什么我不能看清楚我做错了什么。
如果你可以有任何帮助,那可能会很棒。
谢谢!
艾万
,当我有类似的问题被初始化使用记录器挣扎什么工作对我来说:
((org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false)).start(builder.build());
我没试过你的方法,然后虽然。我的问题是记录器没有写任何东西,而且在调试时发现我使用builder
提供的配置从未实际使用过,因为Log4j2以某种方式决定它已经使用相同的配置并且不需要重新配置。
如果以上方法无效,请尝试调试以查看builder.build()
和Configurator.initialize()
中发生的情况。据我记得,我的麻烦是由AbstractLifeCycle.state
国旗需要在状态INITIALIZED
,但变得STARTED
过早。
我对这个解决方案的工作很好!我欠你一个没有必要像你一样挣扎的人。我想我应该想到先调试。 – Erwann
This不知道为什么这个工作,当我试图按照Configurator.initialize()在这里重新配置示例:https://logging.apache.org/log4j/2.x/manual/customconfig.html 它似乎从来没有工作,并始终使用默认配置,无论我如何配置生成器。 – QuestionableUser
我忘了指定,在运行时,文件被创建好了!但是它们仍然是空的,就像控制台一样...... – Erwann
你可以使用“编辑”链接将其添加到问题本身而不是评论中。 –
并且您将标记作为参数进行记录? (例如logger.info(globalMarker,“ACCEPT 1”)对吗? –