多次记录数据打印

时间:2012-05-24 13:58:55

标签: java java-ee log4j

我已经使用log4j为我的Web应用程序实现了一个自定义日志文件。但问题是当我在该日志文件中打印任何东西时,它会打印多次。代码中是否没有循环或任何类型的迭代。任何人都可以帮我解决这个问题。

4 个答案:

答案 0 :(得分:10)

来自:http://www.jajakarta.org/log4j/jakarta-log4j-1.1.3/docs/TROUBLESHOOT.html

log4j输出重复。

在log4j输出中观察重复项的原因是由于将相同的appender多次添加到同一类别(通常是root)或者将相同的appender添加到不同的类别而忽略了appender被累积继承的事实。 p>

log4j不会消除appender重复项。换句话说,如果将同一个appender添加到类别n次,那么该appender将被调用n次以附加到其目标。

略有不同的原因是添加不同的appender,所有appender都将相同的底层输出目标共享到某个类别。在这种现象最常见的情况下,BasicConfigurator.configure()方法被多次调用。每次调用它时,此方法都会将带有System.out目标的appender添加到根类别。

另一个常见的错误是忘记了appender是从层次结构中累积继承的。例如,如果向根类别添加appender(例如A),则所有其他类别将继承A作为appender。因此,如果您将A添加到类别(例如C),那么类别C的启用语句将打印到A两次,一次因为A在root中而一次因为它在C中。

答案 1 :(得分:3)

由于使用相同的appender进行多个Logger配置,我遇到了同样的问题。以下示例将导致LOG4J两次存储一些日志消息:

log4j.logger.com.example = ERROR, out
log4j.logger.com.example.myapp = INFO, out

例如,com.example.myapp.MyClass中的错误消息将被记录两次,因为它们与两个记录器匹配。

要避免此行为,您可以禁用默认启用的Appender Additivity:

log4j.additivity.com.example.myapp = false

有关详细信息,请参阅http://logging.apache.org/log4j/1.2/manual.html#additivity

答案 2 :(得分:-1)

在Web应用程序中,java为每个请求创建单独的线程,因此可能是多次调用函数(在其中放置日志),因此每次都生成日志。

答案 3 :(得分:-1)

请检查您在log4j配置文件中提供的appender,即log4j.xmllog4j.properties。配置中可能列出了多个导致记录器多次记录语句的内容。

如果不是这种情况,请在此处粘贴配置详细信息,以便我们查看。