Log4j修剪常用类别前缀

时间:2010-08-05 18:52:21

标签: java log4j apache-commons-logging

我有一个使用Apache Commons Logging& amp; log4j有大量类进行日志记录。 95%的日志显示相同的前缀

log4j.appender.MyCompany.layout.ConversionPattern = [%d] [% - 5p] [%c]%m%n

[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'根据该方案,考虑每条线路占用多少空间?

2 个答案:

答案 0 :(得分:3)

如果您使用的是Log4j 1.2.16,则可以将布局更改为EnhancedPatternLayout,这样您就可以为category参数指定否定值。来自文档:

  

例如,对于类别名称“alpha.beta.gamma”...%c {-2}将删除两个元素 [从前面]留下“gamma”

这是一个更完整的例子:

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;
  }
}
祝你好运!

答案 1 :(得分:0)

使用%c {2}或%C {2}。该数字指定了要保留的最右侧组件的数量。

请参阅http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html