我已经使用log4j为我的Web应用程序实现了一个自定义日志文件。但问题是当我在该日志文件中打印任何东西时,它会打印多次。代码中是否没有循环或任何类型的迭代。任何人都可以帮我解决这个问题。
答案 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.xml
或log4j.properties
。配置中可能列出了多个导致记录器多次记录语句的内容。
如果不是这种情况,请在此处粘贴配置详细信息,以便我们查看。