2010-10-12 59 views
4

在我的項目我有一個頂層抽象類FrameProducer。我在這個級別添加了一個slf4j記錄器,以便每個繼承類都擁有它。下面的代碼:如何初始化SLF4J(使用log4j的)記錄在適當的抽象類/繼承

public abstract class FrameProducer extends Observable { 

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

    protected BufferedImage frame; 

    public BufferedImage getFrame() { 
     return frame; 
    } 

    public void fireEvent() { 
     logger.debug("Firing event. Implementing class: {}", this.getClass()); 
     setChanged(); 
     notifyObservers(); 
    } 
} 

還有兩個繼承類:CameraFrameGrabberGrayscaleFilter。然而,當該方法fireEvent()正在從CameraFrameGrabberGrayscaleFilter稱爲正在以FrameProducer級別記錄的消息。這裏的日誌,爲了清楚:

FrameProducer.fireEvent - Firing event. Implementing class: class com.ofj.frameaccess.CameraFrameGrabber 
FrameProducer.fireEvent - Firing event. Implementing class: class com.ofj.frameaccess.GrayscaleFilter 

是否可以初始化FrameProducer記錄儀的方式,一切都被在我的類層次結構的最專業級別記錄?

感謝您的任何幫助。


編輯:我log4j.properties看起來是這樣的:

log4j.rootCategory=TRACE, CONSOLE 
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.Threshold=DEBUG 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=%C{1}.%M - %m%n 
+0

它應該這樣做默認情況下。你的'log4j.properties'或'log4j.xml'文件是什麼樣的? – skaffman 2010-10-12 11:34:56

回答

0

感謝您指出正確的方向,以尋找可能的更正skaffman。我終於改變了我的log4j.properties到(如在PatternLayout documentation一個例子說):

log4j.rootCategory=TRACE, CONSOLE 
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.Threshold=DEBUG 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=%-6r [%15.15t] %-5p %30.30c %x - %m%n 

...一切被記錄的權利。因爲它引入了一個潛在的意外依賴性在抽象類

+0

對我沒有任何影響... – 2017-01-04 16:09:48

7

日誌記錄被認爲是由一些反模式。但是,如果你確定你所處理的所有事情都是你自己的,那我想這不是問題。

如果你想要得到的日誌信息,顯示的具體實施,而不是抽象的類名(這是有道理的),然後在抽象類更改日誌初始化語句:

private final Logger logger = LoggerFactory.getLogger(getClass()); 

,而不是其他像:

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

  • 沒有靜態的,因爲它可以被投到別的東西上。
  • getClass()而不是具體的類