log4j和weblogic:重复的日志消息

时间:2011-08-17 14:53:02

标签: java logging log4j weblogic

我使用log4j登录我的项目。这是它的样本设置:

public class MyClass {
  private final Logger logger = Logger.getLogger(MyClass.class);

  public MyClass() {
    BasicConfigurator.configure();
    Logger.getLogger(MyClass.class).setLevel(Level.INFO);
  }

  ...

}

问题在于,在每次下一次记录器调用时,它都会复制日志消息(我的意思是在第一次呼叫时只有1条消息,在第二次呼叫时有2条相同的消息,然后有3条消息,依此类推)。似乎每次创建新记录器的实例并与所有旧实例一起使用 如何避免这个问题? 感谢。

UPP。试图让它静止,但它无论如何都不起作用。我仍然收到多条日志消息。有任何想法吗?可能是某些Weblogic特定的东西?

4 个答案:

答案 0 :(得分:4)

制作记录器static

private static final Logger logger = Logger.getLogger(MyClass.class);

这里的关键是为每个类创建一个Logger,而不是为每个实例创建一个。{/ p>

答案 1 :(得分:2)

尝试设置可加性false programmatically或在配置中

    Logger.getLogger(MyClass.class).setAdditivity(false);

对我而言,当我在 log4j.xml

中设置它时,这就成功了
<logger name="com.stackoverflow.answers.gnat" additivity="false">
    <!-- note additivity value set above -->
    <level value="INFO"/>
    <appender-ref ref="knowledge"/>
    <appender-ref ref="reputation"/>
</logger>

答案 2 :(得分:1)

如果您按照上面的建议使Logger类静态,然后确保您通过JVM级别的-D系统属性或应用程序的配置来配置log4j,那么您应该没有任何问题。在类加载时或实例创建时调用解析配置是不必要的开销。

log4j应该只需要初始化一次配置 - 无论是初始化服务器还是部署应用程序。

您的项目是否为网络应用程序?

此外,您可以在此处找到有关挂钩到WebLogic Server日志记录配置的更多信息:http://download.oracle.com/docs/cd/E12840_01/wls/docs103/logging/logging_services.html

希望有所帮助。

答案 3 :(得分:0)

问题在于BasicConfurator.configure()方法。 我在我的java项目中遇到了完全相同的问题,而且我没有使用WebLogic。

我将BasicConfigurator.configure()方法从beforeTest()移至beforeClass(),突然问题就消失了。

@BeforeClass
public static void beforeClass() {
  BasicConfigurator.configure();
  GeoLogger.setLogLevel(Level.INFO);
}

@Before
public void beforeTest() {
  //BasicConfigurator.configure();
}

希望这有助于指导您找到解决方案。