3

我有一个使用 Apache Commons Logging 和 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] 从 [filepath] 加载配置
[2010-08-05 12:05:52,715][INFO][com.mycompany.projectname.management.ManagerCore] 日志条目 1
[2010-08-05 12:05:52,717][INFO][com.mycompany.projectname.management.ManagerCore] 日志条目 2

我知道使用 %c{1},我可以只显示类别的最后一部分(即类名),但是有没有办法从该包下的每个日志中删除公共部分“com.mycompany.projectname” ,考虑到每条线路占用多少空间?

4

2 回答 2

3

如果您使用的是 Log4j 1.2.16,您可以将布局更改为EnhancedPatternLayout,这样您就可以为类别参数指定一个负值。从文档:

例如,对于类别名称 "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;
  }
}

祝你好运!

于 2010-08-05T21:21:58.957 回答
0

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

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

于 2010-08-05T18:55:21.573 回答