【问题标题】:Log data printing multiple times多次打印日志数据
【发布时间】:2012-05-24 13:58:54
【问题描述】:

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

【问题讨论】:

  • 我认为问题出在您的日志记录配置文件中。我们能看到吗?

标签: java jakarta-ee log4j


【解决方案1】:

发件人: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 中。

【讨论】:

  • 别担心。它是“游戏”的一部分。 :)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      如果不是这样,请将您的配置详细信息粘贴到此处,以便我们查看。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-08
        • 1970-01-01
        • 2020-08-22
        相关资源
        最近更新 更多