2012-03-16 65 views
0

讓我們用日誌的默認代碼開始兩個類之間:阿帕奇常用的日誌記錄

實現:

A類:

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

import com.cc.B; 

public class A { 

    public static Log logger = LogFactory.getLog(A.class); 

    public static void main(String[] args) { 

     logger.info("Entering application."); 
     B b = new B(); 
     b.doIt(); 
     logger.info("Exiting application."); 
    } 
} 

B類:

package com.cc; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

public class B { 
    public static Log log = LogFactory.getLog(B.class); 

     public void doIt() { 
     log.debug("Did it"); 
     } 
} 

執行:

16 mars 2012 09:31:35 com.cc.A main 
INFO: Entering application. 
16 mars 2012 09:31:35 com.cc.B doIt 
INFO: Did it 
16 mars 2012 09:31:35 com.cc.A main 
INFO: Exiting application. 
在B類

,取代public static Log log = LogFactory.getLog(B.class);public static Log log = LogFactory.getLog(A.class);具有日誌應用程序的任何影響。

我該如何登錄到A類記錄器?

+1

發佈您的log4j。屬性,順便說一句:你是什麼意思只登錄到類記錄器?知道你的日誌消息來自哪裏是有道理的 - 你想達到什麼目的? – quaylar 2012-03-16 08:55:22

+0

這是我想要的: '16 mars 2012 09:31:35 com.cc.A main 信息:輸入應用程序。 16 mars 2012 09:31:35 ** com.cc.A ** doIt 信息:是否 16 mars 2012 09:31:35 com.cc.A main INFO:退出應用程序.' – kaissun 2012-03-16 09:00:40

+0

因爲有也是一個方法名稱,我認爲com.cc.B是自動發現的,並且是調用記錄器的方法的一部分地址。 'getLog'的類參數是AFAIK的便利和慣例,所以你可以很容易地通過包來控制日誌級別。 (在包com.example.foo中記錄DEBUG,但包com.example.bar中只包含INFO) – user1252434 2012-03-16 09:39:47

回答

0

第一:我同意quaylar,你確實想知道你的日誌信息來自哪裏,所以我會說這是任何代碼審查的不好的做法。

第二:我認爲你應該總是使用slf4j,這樣你就可以將你使用的所有第三方庫的所有日誌框架連接到你的首選日誌框架。

說了: 你可以實現你想實現,如果你使用log4j的東西,而不是如果您確保是b實例相同的記錄爲A.

一個簡單的辦法是隻使用靜態導入

import static com.cc.A.logger; 

,然後在乙使用它::A中所定義成B中的記錄器的

public void doIt() { 
    logger.debug("Did it"); 
} 
+0

它是一樣的,這段代碼並沒有解決問題:/ – kaissun 2012-03-16 13:29:12

+0

我剛剛意識到,靜態導入不會編譯,因此這不是您的問題的工作解決方案。 – cb2 2012-03-17 17:15:14

0

我得到這樣的輸出:

2012-03-17 18:13:37,859 INFO main cc.A Entering application. 
2012-03-17 18:13:37,861 DEBUG main cc.A Did it 
2012-03-17 18:13:37,861 INFO main cc.A Exiting application. 

有了這個代碼答:

package com.cc; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import com.cc.B; 

public class A { 
    static final Logger logger = LoggerFactory.getLogger(A.class); 
    public static void main(String[] args) { 
     logger.info("Entering application."); 
     B b = new B(); 
     b.doIt(); 
     logger.info("Exiting application."); 
    } 
} 

而這種代碼B:

package com.cc; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
public class B { 
    private static final Logger logger = LoggerFactory.getLogger(A.class); 
    public void doIt() { 
     logger.debug("Did it"); 
    } 
} 

而這種配置的log4j的:

log4j.rootCategory  = DEBUG, A1 
log4j.appender.A1  = org.apache.log4j.ConsoleAppender 
log4j.appender.A1.layout     = org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern = %d %-5p %t %c{2} %m%n 

但我可以」不知道你是否確實在確定了應用之後在每個日誌行中?在這種情況下,只需添加應用程序名稱到日誌模式:

log4j.appender.A1.layout.ConversionPattern = %d %-5p %t %c{2} MyApplicationName %m%n 

如果再改回B到初始化記錄程序是這樣的:

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

你將不得不這樣輸出,而不是:

2012-03-17 18:13:37,859 INFO main cc.A MyApplicationName Entering application. 
2012-03-17 18:13:37,861 DEBUG main cc.B MyApplicationName Did it 
2012-03-17 18:13:37,861 INFO main cc.A MyApplicationName Exiting application. 
+0

感謝您的幫助,但我使用的Apache通用日誌記錄不是log4j,他們是不一樣的 – kaissun 2012-03-22 15:17:47