2011-08-17 77 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(); 
} 

希望能夠幫助您找到解決方案。