0

我在一个java程序中使用了log4j。我初始化它:

BasicConfigurator.configure(); // logger configuration
try {
     logger.setLevel(Level.DEBUG);
} catch (Exception e) {
     System.out.println("Logfile not found");
}

但是,在程序执行期间,我得到 3 个日志语句而不是 1 个。例如,

3 lines 
1047 [main] INFO ibis.Preproc.Ratings  - Added AS TIMEZONE to tZones[0] = GMT-12:00
1047 [main] INFO ibis.Preproc.Ratings  - Added AS TIMEZONE to tZones[0] = GMT-12:00
1047 [main] INFO ibis.Preproc.Ratings  - Added AS TIMEZONE to tZones[0] = GMT-12:00

而不是一行

1047 [main] INFO ibis.Preproc.Ratings  - Added AS TIMEZONE to tZones[0] = GMT-12:00

是否需要对 log4j 进行任何额外的配置来避免这种情况?

4

4 回答 4

4

我经历过类似的行为,结果证明 Log4J 配置了不止一次;使用 BasicConfigurator,还使用我忘记的 log4j.xml 文件。是不是在类路径的某个地方有一个额外的 Log4J 配置?

于 2009-03-07T10:37:32.863 回答
4

很可能您有多个 Appender。请参阅 log4j手册(部分:Appenders 和 Layouts):

给定记录器的每个启用的记录请求都将转发到该记录器中的所有附加程序以及层次结构中更高的附加程序。

您可以尝试将可加性标志设置为 false。

于 2009-03-07T10:58:59.567 回答
2

好吧,你还没有展示你的程序是如何执行的。这是一个仅显示一行的完整程序:

import org.apache.log4j.*;

public class Test
{
    public static void main(String[] args)
    {
        BasicConfigurator.configure(); // logger configuration
        Logger logger = Logger.getLogger(Test.class);
        logger.setLevel(Level.DEBUG);
        logger.info("Hello");
    }
}

你的代码真的有可能运行了三遍吗?

于 2009-03-07T10:28:46.333 回答
0

就我而言,每次调用 BasicConfigurator.configure() 时,我都会添加一个新的附加程序。

我解决了它重置配置:

BasicConfigurator.resetConfiguration() //reset first
BasicConfigurator.configure() // then configure

我必须承认我不清楚发生了什么,但它确实解决了我的问题。

于 2012-07-18T16:17:25.583 回答