1

我有一个 htmlunit 应用程序,我通过以下几行关闭了它的日志记录,因为它在控制台中打印了太多我不需要的消息。

LogFactory.getFactory().setAttribute(
    "org.apache.commons.logging.Log",
    "org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit")
    .setLevel(Level.OFF);   
java.util.logging.Logger.getLogger("org.apache.commons.httpclient")
    .setLevel(Level.OFF);

然后我将最新的 log4j jar 添加到我的项目中并对其进行配置,以便我可以拥有自己的自定义日志消息。但是现在来自 htmlunit 的所有内容也都进入了我的日志文件。我怎样才能防止这种情况?我只希望我自己的日志消息进入日志文件。

4

1 回答 1

0

关于 log4j 要了解的一件重要事情是它的“记录器层次结构”的概念,以及它如何影响它的设置。引用 log4j 文档,

如果一个记录器的名称后跟一个点是后代记录器名称的前缀,则称该记录器是另一个记录器的祖先。如果在它自己和后代记录器之间没有祖先,则称记录器是子记录器的父级。

例如,名为“com.foo”的记录器是名为“com.foo.Bar”的记录器的父级。同样,“java”是“java.util”的父级和“java.util.Vector”的祖先。大多数开发人员应该熟悉这种命名方案。

记录器继承其父级的设置,并且“根记录器”始终位于层次结构的顶部。因此,在某种程度上,您可以将根记录器视为“默认”记录器设置,然后您可以仅为代码中包含的记录器添加这些设置。

我不知道如何在代码中进行设置,但这是我将使用 log4j.properties 文件执行的操作:

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=logs/springapp.log
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

# Direct log messages to console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

# Root logger settings: by default only log messages at level "ERROR" and above 
# will be logged. These messages will be written to console
log4j.rootLogger=error, console

# All loggers with names starting with "org.somecompany.someproject"
# will log messages at all levels "DEBUG" and above.
# They will be written to file as well as console; writing to console
# is enabled since that setting is inherited from the root logger.
log4j.logger.org.somecompany.someproject=debug, file

然后,假设每个类的记录器被命名为该类的完全限定名称,那么只需将上述配置中的“org.somecompany.someproject”替换为项目中包的根包名称,这应该给出你想要的行为。

有关更多信息,请查看log4j 文档

于 2012-08-11T23:08:30.357 回答