2011-08-09 57 views
1

我使用log4j的使用SLF4J和我有以下情況:使用log4j從基類和擴展類中記錄?

package x.y.z.base; 
public class FTPOperationsBase { 

    private final Logger log = LoggerFactory.getLogger(FTPOperationsBase.class); 
    protected FTPClient ftp; 
    // some more fields 

    public void connect() { 
     ... 
     // log all connect exceptions 
    } 
    public void disconnect() { 
     ... 
     // log all disconnect exceptions 
    }; 
} 

由於可以看出,封裝x.y.z.base。現在我有幾個擴展這個基類的類(這些類目前在x.y.z.cl​​assA,x.y.z.cl​​asB,...等包中)。

我想單獨的日誌文件爲這些類,因爲它們作爲單獨的模塊。但我也想要以某種方式將日誌從基類放到這些單獨的日誌中,具體取決於正在使用哪個類,即如果只有一個子類正在執行,我不希望所有日誌中都有日誌形式基類。例如,如果我已經擴展類:

public class FTPExtendedClass1 
extends FTPOperationsBase { 
    public void doSomething() {...} 
} 

,使下面的代碼序列:

FTPExtendedClass1 obj1 = new FTPExtendedClass1(); 
obj1.connect(); 
obj1.doSomething(); 
obj1.disconnect(); 

我想有日誌文件對於這種情況如下:

  • 來自connect的可能信息/警告/錯誤()
  • doSomething()的可能信息/警告/錯誤
  • 可能方式/警告/從斷開錯誤()

這應該是所有擴展類,其中doSomething的()是特定於類的方法的情況。任何方式來組織軟件包/爲此行爲配置log4j?

謝謝。

回答

1

您必須在您的log4j.xml中創建不同的Appender。

每個不同類別的一個。

<logger name="yourBaseClassName" additivity="false"> 
    <level value="INFO" /> 
    <appender-ref ref="BasefileAppender" /> 
</logger> 

<appender name="BasefileAppender" class="org.apache.log4j.FileAppender"> 
<param name="File" value="/path/yourfile.log"/> 

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

<logger name="yourExtendedClassName" additivity="false"> 
    <level value="INFO" /> 
    <appender-ref ref="ExtendOnefileAppender" /> 
</logger> 

<appender name="ExtendOnefileAppender" class="org.apache.log4j.FileAppender"> 
<param name="File" value="/path/ExtendOnefileAppender.log"/> 

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

然後在每個類的(基本和擴展),你這樣做:

Logger mylogger = Logger.getLogger(MyClass.class.getName()) 

,我不認爲它涵蓋你的第二個要求(但我也想是某種方式把從日誌基類到這些單獨的日誌,這取決於使用哪個類)

但它是一個開始... ;-)與此,您應該能夠根據類的名稱登錄不同的文件。

希望它有幫助

+0

那麼,正如你所說,這不是我正在尋找的解決方案,我已經知道這種配置。我想我只是通過基類方法聲明來傳播異常,或者傳遞記錄器引用,它們都可以工作。無論如何,+1需要時間來回答問題;) – Less