2010-08-05 52 views
3

我有一個項目,它使用Apache Commons Logging & log4j與大量的類進行日誌記錄。我的日誌的95%顯示具有相同前綴Log4j修剪常見類別前綴

log4j.appender.MyCompany.layout.ConversionPattern = [%d] [% - 5P] [%C]%米%正

 
[2010-08-05 11:44:18,940][DEBUG][com.mycompany.projectname.config.XMLConfigSource] Loading config from [filepath] 
[2010-08-05 12:05:52,715][INFO ][com.mycompany.projectname.management.ManagerCore] Log entry 1 
[2010-08-05 12:05:52,717][INFO ][com.mycompany.projectname.management.ManagerCore] Log entry 2 

我知道%c {1},我可以只顯示類別的最後一部分(即類名),但有沒有辦法從該包下的每個日誌中刪除公共部分'com.mycompany.projectname'考慮每條生產線佔用多少空間?

回答

3

如果您使用的是Log4j 1.2.16,則可以將佈局更改爲EnhancedPatternLayout,從而可以指定類別參數的值。從該文檔:

例如,對於分類名爲 「alpha.beta.gamma」 ...%C {-2} [從前面]將除去兩個元件離開 「伽馬」

下面是一個更完整的例子:

log4j.appender.C.layout=org.apache.log4j.EnhancedPatternLayout 
log4j.appender.C.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%t] [%c{-3}] %m%n 

而你的情況應該砍掉com.mycompany.projectname

但是,這將適用於消息被記錄,即使它不是來自您的代碼。換句話說,類別org.hibernate.engine.query.HQLQueryPlan將被修整爲query.HQLQueryPlan,這可能不是您想要的。

如果您需要對此進行絕對控制(即您想特別去除每條消息中的文本「com.mycompany.projectname」),則需要實現您自己的Layout類。像這樣的東西應該這樣做:

import org.apache.log4j.PatternLayout; 
import org.apache.log4j.spi.LoggingEvent; 

public class MyPatternLayout extends PatternLayout 
{ 
    @Override 
    public String format(LoggingEvent event) 
    { 
    String msg = super.format(event); 
    msg = msg.replace("com.mycompany.projectname", ""); 

    return msg; 
    } 
} 

祝你好運!

+0

謝謝。這正是我想要的。 – 2010-08-05 22:20:47

0

使用%c {2}或%C {2}。該數字指定要保留的最右邊組件的數量。

請參閱http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

+0

謝謝,但我正在從左邊修剪,因爲如果有東西com.mycompany.projectname.a.b.C,我想它顯示爲a.b.C.如果它是com.mycompany.projectname.d.E,我希望它顯示爲d.E.有了%c {2},我只能得到兩個最右邊的元素。 – 2010-08-05 19:06:17

+0

@sdeer是的,就是這樣。如果指定數字2,則最右邊的兩項保留:d.E – 2010-08-05 19:24:07