2014-02-07 41 views
1

我的主要方法創建一個記錄器實例,並將它設置爲全局變量。如果我想使用相同的日誌文件來記錄消息,是很好的做法,同樣的記錄器實例傳遞給不同的構造函數的類。你怎麼能做到這一點,而不是傳球。我應該繼續傳遞的記錄器實例不同類

public static void main(String[] args) { 
     Date date = new Date(); 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); 
     Handler h = new FileHandler("../logs/MyLogFile_" 
       + sdf.format(date) + ".log", true); 
     h.setFormatter(new SingleLineFormatter()); 
     h.setLevel(Level.ALL); 
     logger.setUseParentHandlers(false); 
     logger.addHandler(h); 
} 

public void go(XMLConfig config) throws Exception {  
    Controller.setGlobalErrorHandler(new ErrorHandler(logger)); 
} 

public class ErrorHandler implements FDSErrorHandler { 

    private static Logger logger = Logger.getLogger("com.explore.lse"); 

    public ErrorHandler(Logger logger) { 
     this.logger = logger; 
    } 
} 

回答

7

沒有,它最肯定的心不是:-)

使用日誌框架的常見模式是在每一個打印出記錄(爲當然記錄器的假設類的私人最後靜態記錄儀領域的選擇的框架是線程安全的大多數是):

public class MyClass { 
    private final static Logger log = LoggerFactory.getLogger(MyClass.class); //or the equivalent for your logging framework 

    //rest of the code 
} 

然後你可以控制哪些類(==記錄器)進入什麼用日誌配置(通常是XML)文件。

有時(「有時」是相當罕見,大多使用的框架)檢索記錄儀時,你會使用,而不是類名「主題名稱」。因此,例如:

public class SomeSecurityRelatedClass { 

    public void authenticateUser(String username, String pass) { 
     if (!passCorrect(...)) { 
     LoggerFactory.getLogger("SECURITY").info("rejecting user .... //etc 
     } 
    } 
} 

,雖然IM的咆哮,記錄器名稱的另一種常見的虐待是當人們想以某種方式「標記」在並行環境的具體過程(比如,你希望所有與同一日誌用戶的請求去每個用戶相同的文件)。不要濫用記錄器名稱。相反,請熟悉MDCs的概念。它們至少支持log4jslf4j/Logback,可用於「標記」進程或向您的日誌添加任何其他額外數據

+0

+1對於_definitely isn't_。 –