4

log4j でクラス名とメソッド名を出力する方法を知っています。両方のフィールドを個別に整列およびパディングできます。たとえば、次のパターンです。

[%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

これは構成のみを使用して可能ですか?

ログに記録されたメッセージ テキストを揃えたまま、メソッド名とクラス名を出力する別の方法を提案できますか?

4

1 に答える 1

0

これは、構成だけでは不可能のようです。次のより簡単な解決策は、文字「b」を使用して log4j.ini で使用できるカスタム PatternLayout のようです。

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);
        }
    }
}
于 2012-10-03T06:52:52.777 に答える