自定义log4j布局类未被调用

时间:2012-01-03 22:28:51

标签: log4j

我有一个扩展PatternLayout的自定义log4j布局类,我的布局类只是掩盖了日志中的密码。它适用于简单的控制台应用程序。这是log4j.xml

<?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>

这是布局类的一部分:

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":"*****"},

但是一旦我将自定义布局类移动到我的webapp(log4j.xml完全相同。),它就不会被调用(即没有System.out输出)并且仍然显示pswd。我使用此cmd在Jetty上使用maven在本地运行webapp:mvn jetty:run

这是调用代码:

// 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 );

有什么想法吗?感谢

2 个答案:

答案 0 :(得分:0)

在Java EE服务器环境中,我会说:这是一个类加载器问题。 Jetty是一个servlet容器,所以它的类加载架构更简单;不过,值得一试。如果你的log4j 不是部署在WAR中,而是来自Jetty类路径,这几乎肯定是原因。

尝试将类加载策略更改为“父级最后”,如the Jetty manual中所述,看看是否有帮助。

答案 1 :(得分:0)

您应该在log4j中导入您的类的包名称。我将log4j2.xml添加如下:

 public List<VerseInfo> ReadFromStorage(String Translation, String Bookspec, int Chapter, int StartingVerse, int EndingVerse)
        {
            ...code here
            var bookResult = client.CreateDocumentQuery<CosmosBook>(UriFactory.CreateDocumentCollectionUri(_connInfo["DatabaseId"], "books"), new FeedOptions { EnableCrossPartitionQuery = true , MaxItemCount = 1})
                .Where(b => b.Matchspec.Contains($"[{Bookspec}]"))
                .AsDocumentQuery()
                .ExecuteNextAsync<CosmosBook>().Result;
            ...code here
            return vList;
         }