2012-01-03 66 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中所述,看看它是否有帮助。