【发布时间】:2012-05-24 13:58:54
【问题描述】:
我已经为我的 Web 应用程序使用 log4j 实现了一个自定义日志文件。但问题是当我在该日志文件中打印任何内容时,它会打印多次。代码中是否没有循环或任何类型的迭代。任何人都可以帮我解决这个问题。
【问题讨论】:
-
我认为问题出在您的日志记录配置文件中。我们能看到吗?
标签: java jakarta-ee log4j
我已经为我的 Web 应用程序使用 log4j 实现了一个自定义日志文件。但问题是当我在该日志文件中打印任何内容时,它会打印多次。代码中是否没有循环或任何类型的迭代。任何人都可以帮我解决这个问题。
【问题讨论】:
标签: java jakarta-ee log4j
发件人: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 目标的附加程序添加到根类别。
另一个常见的错误是忘记附加程序是从层次结构累积继承的。例如,如果您向根类别添加一个附加程序,例如 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 。配置中可能列出了多个导致记录器多次记录语句的情况。
如果不是这样,请将您的配置详细信息粘贴到此处,以便我们查看。
【讨论】: