我希望有一段代码可以仅将所有(或仅错误日志)从log4j保存到文件中。我找到并尝试过的所有解决方案仍在控制台中显示信息,而我不想这样做。 我尝试了这段代码:
public static void configureLogging(String fileName) {
ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
builder.setStatusLevel(Level.ALL);
LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout").addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable");
ComponentBuilder triggeringPolicies = builder.newComponent("Policies")
.addComponent(builder.newComponent("CronTriggeringPolicy")
.addAttribute("schedule", "0 0 0 * * ?"))
.addComponent(builder.newComponent("SizeBasedTriggeringPolicy")
.addAttribute("size", "100M"));
AppenderComponentBuilder rollingFile
= builder.newAppender("rolling", "RollingFile").add(layoutBuilder);
rollingFile.addAttribute("fileName", fileName + ".log");
rollingFile.addAttribute("filePattern", fileName + "-%d{MM-dd-yy}.log.gz");
rollingFile.addComponent(triggeringPolicies);
builder.add(rollingFile);
builder.add(builder.newRootLogger(Level.ALL).add(builder.newAppenderRef("rolling")));
builder.setConfigurationName("BuilderTest");
Configurator.initialize(builder.build());
}
但我在控制台终端中看到了所有内容:
2018-11-16 11:24:42,884 main DEBUG Apache Log4j Core 2.11.1 initializing configuration org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration@3b0143d3
2018-11-16 11:24:42,887 main DEBUG Installed 1 script engine
2018-11-16 11:24:43,166 main DEBUG Oracle Nashorn version: 1.8.0_144, language: ECMAScript, threading: Not Thread Safe, compile: true, names: [nashorn, Nashorn, js, JS, JavaScript, javascript, ECMAScript, ecmascript], factory class: jdk.nashorn.api.scripting.NashornScriptEngineFactory
2018-11-16 11:24:43,166 main DEBUG PluginManager 'Core' found 117 plugins
2018-11-16 11:24:43,166 main DEBUG PluginManager 'Level' found 0 plugins
2018-11-16 11:24:43,168 main DEBUG PluginManager 'Lookup' found 13 plugins
2018-11-16 11:24:43,168 main DEBUG Building Plugin[name=AppenderRef, class=org.apache.logging.log4j.core.config.AppenderRef].
2018-11-16 11:24:43,170 main DEBUG createAppenderRef(ref="rolling", level="null", Filter=null)
2018-11-16 11:24:43,170 main DEBUG Building Plugin[name=root, class=org.apache.logging.log4j.core.config.LoggerConfig$RootLogger].
2018-11-16 11:24:43,173 main DEBUG createLogger(additivity="null", level="ALL", includeLocation="null", ={rolling}, ={}, Configuration(BuilderTest), Filter=null)
2018-11-16 11:24:43,174 main DEBUG Building Plugin[name=loggers, class=org.apache.logging.log4j.core.config.LoggersPlugin].
有人可以解释我的方法有什么问题吗?
非常感谢, 乔奥
答案 0 :(得分:0)
没有更多细节,很难给出确切的答案,但是,我会尽力帮助您指出正确的方向。
首先,我强烈建议您不要使用程序化配置,除非您有充分的理由。 Log4j2提供了一些非常不错的功能,使通过配置文件执行几乎所有操作成为可能。
我最好的猜测是您想使用在运行时以某种方式选择的动态文件名。如果是这种情况,您绝对可以使用log4j2 lookups进行此操作。在另一个answer中,我编写了一个使用system properties lookup的示例。如您所见,文件名基于系统属性是动态的,而不是静态的或硬编码到配置文件中的。还有很多其他查询,因此我建议仔细阅读该手册并选择最适合您的需求。
关于您如何将所有日志发送到文件的问题,只需不指定一个console appender就可以了。如log4j2 manual中所述:
Appender负责将LogEvent发送到其 目的地。
再次参考我写的其他answer,您还会注意到该配置未使用控制台附加程序,因此不会生成任何控制台消息。
由于我看不到您创建控制台附加程序,所以我认为问题在于以下原因:builder.setStatusLevel(Level.ALL);
这似乎是将log4j2 status logger设置为“ ALL”级别,这意味着它将生成所有内部log4j2日志消息。我建议使用级别“ WARN”或“ ERROR”,但如果您确实要确保从不将消息发送到控制台,则可以将其设置为“ OFF”。