2012-01-03 24 views
1

我有一個自定義的log4j佈局類,它擴展了PatternLayout,我的佈局類只是在日誌中掩蓋了密碼。它工作在一個簡單的控制檯應用程序這裏的的log4j.xml定製log4j佈局類不被稱爲

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 

    <appender name="A1" class="org.apache.log4j.ConsoleAppender"> 
    <layout class="com.PortalLog4jFilteringPattern"> <param name="ConversionPattern" value="%t %-5p %c{2} - %m%n"/> </layout> 
</appender> 

<root> 
    <priority value ="DEBUG" /> <appender-ref ref="A1" /> 
</root> 
</log4j:configuration> 

這裏的佈局類的snipet:

public class PortalLog4jFilteringPattern extends PatternLayout { 
// omitted 
@Override 
public String format(LoggingEvent event) { 
    System.out.println("in format()...... "); 
// rest omitted 

下面是調用代碼:

import org.apache.log4j.Logger; 

    public class ProductDemo { 

    private static Logger logger = Logger.getLogger(ProductDemo.class); 

    public ProductDemo() { 
    } 

    public void processOrder(CustomerOrder order) { 
    logger.info(order.getProductName()); 
    } 
// rest ommited 

了樣本結果日誌與PSWD被屏蔽:

main INFO test.ProductDemo - "password":"*****"}, 

但是,一旦我將銅stom layout class到我的webapp(log4j.xml是完全一樣的),它不會被調用(即沒有System.out輸出)並且pswd仍然顯示。我用這個CMD上碼頭行家本地運行web應用程序:命令mvn碼頭:運行

下面是調用代碼:

// original code, but I changed it to import org.apache.log4j.Logger for experiment 
//import org.slf4j.LoggerFactory; 
//import org.slf4j.Logger; 
import org.apache.log4j.Logger; 

public class BlahBlahClass extends Blah 
// things omitted 

private final static Logger log = Logger.getLogger(BlahBlahClass .class); 

任何想法?謝謝

+0

只是一個想法,但也許碼頭管道stdout別的地方,你沒有看到它? – 2012-01-03 22:42:46

回答

0

在Java EE服務器環境中,我會說:這是一個類加載器問題。 Jetty是一個servlet容器,所以它的類加載架構更簡單;仍然值得檢查。如果您的log4j 不是在WAR內部署的,而是來自Jetty類路徑,這幾乎肯定是原因。

嘗試將類加載策略更改爲「parent last」,如the Jetty manual中所述,看看它是否有幫助。