2010-08-05 49 views
3

我有一个项目,它使用Apache Commons Logging & log4j与大量的类进行日志记录。我的日志的95%显示具有相同前缀Log4j修剪常见类别前缀

log4j.appender.MyCompany.layout.ConversionPattern = [%d] [% - 5P] [%C]%米%正

 
[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'考虑每条生产线占用多少空间?

回答

3

如果您使用的是Log4j 1.2.16,则可以将布局更改为EnhancedPatternLayout,从而可以指定类别参数的值。从该文档:

例如,对于分类名为 “alpha.beta.gamma” ...%C {-2} [从前面]将除去两个元件离开 “伽马”

下面是一个更完整的例子:

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; 
    } 
} 

祝你好运!

+0

谢谢。这正是我想要的。 – 2010-08-05 22:20:47

0

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

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

+0

谢谢,但我正在从左边修剪,因为如果有东西com.mycompany.projectname.a.b.C,我想它显示为a.b.C.如果它是com.mycompany.projectname.d.E,我希望它显示为d.E.有了%c {2},我只能得到两个最右边的元素。 – 2010-08-05 19:06:17

+0

@sdeer是的,就是这样。如果指定数字2,则最右边的两项保留:d.E – 2010-08-05 19:24:07