我有一个使用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'根据该方案,考虑每条线路占用多少空间?
答案 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。