2011-08-17 114 views
5

我使用log4j来登录我的项目。这里它的样品设置:log4j和weblogic:重复的日志消息

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

使记录仪static

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

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

+0

谢谢@Shawn。 – kardanov

+0

嗯,试过这个,但没有成功。这真的很奇怪,因为你的建议看起来非常合理。其他想法?什么会导致问题?可能是一些Weblogic特定的东西? – kardanov

+0

您是否找到了解决方案?我在这里有同样的行为,并不能解决这个问题。 –

2

尝试设置可加性falseprogrammatically或在配置中。

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> 
+0

谢谢你的回答@gnat,但现在我得到了异常:'log4j:警告没有appender可以找到记录器 log4j:警告请初始化log4j系统正确'没有记录器似乎已初始化。 – kardanov

+0

_WARN No appenders ..._我明白了。听起来很熟悉。从来没有人能够明确原因(我是否写过我讨厌log4j文档?只有maven文档似乎比它差),但当我设置一些属性太早时,总觉得它会发生。考虑尽可能晚地设置可加性。在我的回复中,Btw'xml'示例是从代码库中复制的。我现在使用它(我只是混淆了公司特定的名称和参考),它被证明在最后半年工作得很好。 – gnat

1

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

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

您的项目是一个Web应用程序?

此外,你可以找到更多关于挂接到WebLogic Server的日志配置在这里:http://download.oracle.com/docs/cd/E12840_01/wls/docs103/logging/logging_services.html

希望有所帮助。

+0

谢谢@kevinpowe – kardanov

+0

快乐, @kardanov - 如果您发现答案有用,如果您可以投票回答,那将是非常好的。希望记录现在对你更好。 – kevinpowe

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(); 
} 

希望能够帮助您找到解决方案。