如何从Java代码中禁用log4j日志记录

Ere*_*evi 13 java log4j

我使用一个使用log4j写日志的旧库.我的默认log4j.properties文件将日志定向到控制台,但在我的主程序的某些特定功能中,我想完全禁用日志记录(来自所有类).

我试过这个:

Logger.getLogger(BasicImplementation.class.getName()).setLevel(Level.OFF);
Run Code Online (Sandbox Code Playgroud)

其中"BasicImplementation"是执行日志记录的主要类之一,但它不起作用 - 日志仍然写入控制台.

这是我的log4j.properties:

log4j.rootLogger=warn, stdout
log4j.logger.ac.biu.nlp.nlp.engineml=info, logfile
log4j.logger.org.BIU.utils.logging.ExperimentLogger=warn

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %-5p %d{HH:mm:ss} [%t]: %m%n

log4j.appender.logfile = ac.biu.nlp.nlp.log.BackupOlderFileAppender
log4j.appender.logfile.append=false
log4j.appender.logfile.layout = org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern = %-5p %d{HH:mm:ss} [%t]: %m%n
log4j.appender.logfile.File = logfile.log
Run Code Online (Sandbox Code Playgroud)

MaD*_*aDa 21

因此,您定义了3个记录器,包括根:

log4j.rootLogger=warn, stdout
log4j.logger.ac.biu.nlp.nlp.engineml=info, logfile
log4j.logger.org.BIU.utils.logging.ExperimentLogger=warn
Run Code Online (Sandbox Code Playgroud)

不幸的是,要以编程方式禁用它们,您需要在代码中指定ALL OF THEM:

Logger.getLogger("ac.biu.nlp.nlp.engineml").setLevel(Level.OFF);
Logger.getLogger("org.BIU.utils.logging.ExperimentLogger").setLevel(Level.OFF);
Logger.getRootLogger().setLevel(Level.OFF);
Run Code Online (Sandbox Code Playgroud)

以下是如何将其重置回配置文件中设置的内容.


sch*_*rer 9

如果你想实现完美的沉默(比如一个安静的命令行工具),你总是可以使用NullAppender.

Logger.getRootLogger().removeAllAppenders();
Logger.getRootLogger().addAppender(new NullAppender());
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以使用

Logger.getRootLogger().setLevel(Level.OFF); 
Run Code Online (Sandbox Code Playgroud)

禁用java代码中的任何日志记录