2015-01-09 109 views
0

我如何記錄擴展類的名稱?我想要寫「FTSControl」而不是「Control」。Log4j打印擴展類名

public abstract class Control { 
    Logger logger = Logger.getLogger(getClass()); 
} 

@Component 
public class FTSControl extends Control { 

} 

<layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%d{dd.MM.yyyy HH:mm:ss.SSS} %-5p - %C{1}:%m%n" /> 
</layout> 

輸出:

09.01.2015 15:58:00.006 WARN - Control: No files found! Hash:-844390824 

我還指出sometinh是,

儘管使用相同的記錄器實例,log.info()調用在控制和FTSControl的方法打印自己的班級名稱。我的意思是在FTSControl打印

09.01.2015 15:58:00.006 WARN - FTSControl : No files found! Hash:-844390824 

logger.info()的方法

logger.info()在控制的方法打印

09.01.2015 15:58:00.006 WARN - Control: No files found! Hash:-844390824 

//更新完成示例

package com.log; 

import org.apache.log4j.Logger; 
import org.apache.log4j.xml.DOMConfigurator; 

import com.log.abstracttest.ControlAbs; 
import com.log.abstracttest.ImosControl; 


public class LogMainTest { 

    private Logger logger = Logger.getLogger("console"); 

    public LogMainTest(){ 
     DOMConfigurator.configure(this.getClass().getClassLoader().getResource("log4j.xml")); 
     logger.info("Initializing..."); 

     ImosControl control = new ImosControl(); 
     control.print(); 
     control.printAll(); 

    } 

    public static void main(String[] args) { 
     new LogMainTest(); 

    } 


} 


package com.log.abstracttest; 

import org.apache.log4j.Logger; 

public abstract class ControlAbs { 
    Logger logger = Logger.getLogger(this.getClass()); 

    public void print(){ 
     logger.info(" print"); 
    } 

} 


package com.log.abstracttest; 

public class ImosControl extends ControlAbs { 

    public void printAll(){ 
     logger.info("printAll"); 
    } 

} 

輸出:

10.01.2015 05:38:43.497 INFO - LogMainTest:Initializing... 
10.01.2015 05:38:43.502 INFO - ControlAbs: print 
10.01.2015 05:38:43.503 INFO - ImosControl:printAll 

回答

0

我改變了我的ConversionPattern,如下所示。選自C - >Ç

<param name="ConversionPattern" value="%d{dd.MM.yyyy HH:mm:ss.SSS} %-5p - [%c{1}]:%m%n" /> 

轉換字符含義

Ç用於輸出記錄事件的類別。例如,對於類別名稱「a.b.c」,模式%c {2}將輸出「b.c」。

C用於輸出發出日誌記錄請求的調用方的全限定類名。例如,對於類名「org.apache.xyz.SomeClass」,模式%C {1}將輸出「SomeClass」。

2

只是

protected final Logger logger = Logger.getLogger(this.getClass()); 

這樣,你會在日誌中獲得實例化的類名,如果您使用更換Logger logger = Logger.getLogger(getClass());在抽象類像logger.info("test")裏面FTSControl

+0

我改變了它,因爲你說過,BT不起作用 –

+0

檢查編輯的答案 –

+0

我已經更新了這個問題,請看問題的結尾。 –

0

我反而會建議在每個類中爲Logger設置一個'private static final'實例,並將其與'C'一起使用。這樣記錄器可以用於靜態方法,並且記錄的類可以更加自信地識別。

public class FTSControl extends Control { 
    private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(FTSControl.class); 
} 

更改模式以打印類別而不是調用類是「全局」更改,可能會導致意外。

+0

在這種情況下,父類(Control)中的方法使用自己的記錄器實例並導致將Control作爲Class名稱而不是FTControl進行打印。請參閱下面的答案。它更靈活,適合OOD。 –

+0

我的注意力集中在涉及靜態方法的情況下,與日誌記錄模式中的類別結合使用,在這種情況下,從類中調用類會更簡單。但我想這種情況可能永遠不會發生。 (例如:具有相同靜態方法的基類和子類)。 –