2014-07-24 99 views
0

我正在使用My WebMethods Server,它是一個servlet容器。 MWS缺省日誌記錄實現是log4j,所以我可以在我的項目中不包含任何jar的情況下使用它。 由於MWS Root Logger與所有包含的應用程序和服務器實例本身交叉,因此我不應該使用它。相反,我的方法是爲每個應用程序創建一個新的Logger。我在屬性文件中設置Logger名稱,並打算從Servlet的init()方法中讀取它。 由於logger-name參數,我想從頁面bean代碼中分離獲取Logger。我一直在想創建一個保存記錄器名稱並獲取Logger實例的Singleton。使用單例獲取log4j Logger實例以隔離記錄器名稱

綜上所述,我已經在做這樣的事情一直在思考:

package com.webmethods.caf.log; 

import org.apache.log4j.LogManager; 
import org.apache.log4j.Logger; 

public class CAFLogger { 

    private static String appLoggerName; 
    private static Logger logger; 

    private CAFLogger() { 

    } 

    public static void setLoggerName(String loggerName) { 
     if (appLoggerName == null) { 
      appLoggerName = loggerName; 
     } 
    } 

    public static Logger getLoggerInstance() { 
     if (logger == null) { 
      logger = LogManager.getLogger(appLoggerName); 
     } 
     return logger; 
    } 
} 

然後調用從我init()方法setLoggerName()getLoggerInstance()從頁面豆類。 這是一個非常糟糕的主意嗎?

我一直在閱讀有關的單身話題的其他職位,如下所示:

Benefits of Log4j singleton wrapper?

Log4J: Strategies for creating Logger instances

,但他們都建議使用類名來獲得Logger對象,而我需要使用記錄器名稱。

PS。請原諒我的英語。我很樂意根據您的意見糾正任何錯誤或語法錯誤,並添加任何缺乏的信息。

回答

0

您可以根據包名稱在log4j.xmllog4j.properties中定義類別,在這種情況下,您不需要通過名稱獲取記錄器。只需按類名獲取記錄器,並根據類別將記錄在適當的appender中。

爲如:

<category name="com.x.y.z.server"> 
    <priority value="ERROR" /> 
    <appender-ref ref="SERVER_FILE_LOG" /> 
</category> 

<category name="com.x.y.z.client"> 
    <priority value="ERROR" /> 
    <appender-ref ref="CLIENT_FILE_LOG" /> 
</category> 
+0

東西我忘了說的是,大多數類相同的封裝結構,在所有應用中,即以'com.webmethods.caf'開始,儘管他們屬於該應用程序,每個屏幕都有一個包,例如'com.webmethods.caf.screen1'。通過類名來定義類別將會很困難。這就是爲什麼我使用記錄器名稱而不是類來獲取記錄器對象。 – DiegoAlfonso