3

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

4

4 回答 4

10

来自: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 中。

于 2012-05-24T17:49:09.433 回答
3

由于多个 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

于 2013-12-09T10:33:38.313 回答
-1

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

于 2012-05-24T14:11:12.520 回答
-1

请检查您在 log4j 配置文件中提供的附加程序,log4j.xmllog4j.properties. 配置中可能列出了多个导致记录器多次记录语句的情况。

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

于 2012-05-24T14:19:13.503 回答