我已经为我的 Web 应用程序使用 log4j 实现了一个自定义日志文件。但问题是当我在该日志文件中打印任何内容时,它会打印多次。代码中是否没有循环或任何类型的迭代。任何人都可以帮我解决这个问题。
4 回答
来自:http ://www.jajakarta.org/log4j/jakarta-log4j-1.1.3/docs/TROUBLESHOOT.html
log4j 输出中的重复项。
在 log4j 输出中观察到重复的原因要么是由于多次将相同的 appender 添加到同一类别(通常是 root),要么将相同的 appender 添加到不同的类别而忽略了 appender 是累积继承的事实。
log4j 不会消除 appender 重复项。换句话说,如果您将相同的 appender 添加到类别 n 次,则该 appender 将被调用 n 次以附加到其目标。
一个稍微不同的原因是添加不同的附加器,它们都共享相同的基础输出目标到某个类别。在这种现象最常见的情况下,BasicConfigurator.configure() 方法被多次调用。每次调用它时,此方法都会将带有 System.out 目标的附加程序添加到根类别。
另一个常见的错误是忘记了 appender 是从层次结构中累积继承的。例如,如果您向根类别添加一个附加程序,例如 A,则所有其他类别都将继承 A 作为附加程序。因此,如果你将 A 添加到一个类别,比如 C,那么一个启用的类别 C 的语句将打印到 A 两次,一次是因为 A 在根目录中,一次是因为它在 C 中。
由于多个 Logger 配置使用相同的 appender,我遇到了同样的问题。这是一个示例,它会导致 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。
在 Web 应用程序中,java 为每个请求创建单独的线程,因此函数(您放置日志的位置)可能会多次调用,因此每次都会生成日志。
请检查您在 log4j 配置文件中提供的附加程序,log4j.xml
即log4j.properties
. 配置中可能列出了多个导致记录器多次记录语句的情况。
如果不是这种情况,请在此处粘贴您的配置详细信息,以便我们查看。