2012-09-20 26 views
4

我知道如何用log4j輸出classname和methodname,這兩個字段可以分別對齊和填充,例如,這種模式:是否可以使用格式修飾符組合兩個轉換字符?

[%d{ISO8601}] %-5p %-10C{1}:%-10M %m%n 

產生類似:

[2012-09-20 08:25:12,111] WARN Class  :method  Logtext1 which should align 
[2012-09-20 08:25:12,111] WARN ClassTwo :methodName Logtext2 which should align 

這將對齊文本記錄(在大多數情況下),但類名和方法名是醜陋的間隔。

所以我想輸出是一樣的東西:

[2012-09-20 08:25:12,111] WARN Class:method   Logtext1 which should align 
[2012-09-20 08:25:12,111] WARN ClassTwo:methodName Logtext2 which should align 

這可能使用僅配置?

你可以建議另一種輸出方法名和類名的方法,保持記錄的消息文本對齊?

回答

0

這似乎是不可能使用配置。 接下來簡單的解決方案似乎是一個自定義的PatternLayout,其然後可以與字符「B」的log4j.ini使用:

log4j.appender.filelog.layout = your.full.namespace.BPatternLayout log4j的.appender.filelog.layout.ConversionPattern = [%d {ISO8601}]%-5p%-30b%m%n

希望它可以幫助其他人。

BPatternLayout.java:

import org.apache.log4j.PatternLayout; 
import org.apache.log4j.helpers.PatternParser; 

public class BPatternLayout extends PatternLayout 
{ 
    @Override 
    protected PatternParser createPatternParser(String pattern) 
    { 
     return new BPatternParser(pattern); 
    } 
} 

BPatternParser.java:

import org.apache.log4j.helpers.FormattingInfo; 
import org.apache.log4j.helpers.PatternConverter; 
import org.apache.log4j.helpers.PatternParser; 
import org.apache.log4j.spi.LocationInfo; 
import org.apache.log4j.spi.LoggingEvent; 

public class BPatternParser extends PatternParser 
{ 
    public BPatternParser(String pattern) 
    { 
     super(pattern); 
    } 

    @Override 
    protected void finalizeConverter(char c) 
    { 
     switch (c) 
     { 
     case 'b': 
      currentLiteral.setLength(0); 
      addConverter(new BPatternConverter(formattingInfo)); 
      break; 
     default: 
      super.finalizeConverter(c); 
     } 
    } 

    private class BPatternConverter extends PatternConverter 
    { 
     BPatternConverter(FormattingInfo formattingInfo) 
     { 
      super(formattingInfo); 
     } 

     @Override 
     protected String convert(LoggingEvent evt) 
     { 
      LocationInfo locationInfo = evt.getLocationInformation(); 
      return getPartialClassName(locationInfo, 1) + ":" + locationInfo.getMethodName(); 
     } 

     /** 
     * Code from org.apache.log4j.helpers.PatternParser.NamedPatternConverter 
     */ 
     private String getPartialClassName(LocationInfo loc, int precision) 
     { 
      String n = loc.getClassName(); 
      if (precision <= 0) { 
       return n; 
      } 

      int len = n.length(); 

      // We substract 1 from 'len' when assigning to 'end' to avoid out of 
      // bounds exception in return r.substring(end+1, len). This can happen if 
      // precision is 1 and the category name ends with a dot. 
      int end = len - 1; 
      for (int i = precision; i > 0; i--) 
      { 
       end = n.lastIndexOf('.', end - 1); 
       if (end == -1) 
        return n; 
      } 
      return n.substring(end + 1, len); 
     } 
    } 
} 
相關問題