7

FileAppender で log4net を使用しています。レイアウトパターンは"%utcdate %message%newline"ですので、メッセージはすべて1行です。
ただし、改行文字を含むメッセージには問題があります。ファイルに書き込む前に改行をエスケープすることは可能ですか?

4

3 に答える 3

7

改行文字をエスケープするカスタム PatternConverter を作成できます。

これは、任意のアペンダーで使用できるため、他の回答よりも柔軟なソリューションを提供します。

これらの記事に従って、改行文字をスペースに置き換えるカスタム PatternConverter を実装しました。

https://dejanfajfar.wordpress.com/2011/04/14/log4net-custom-layoutpattern/

http://www.hanselman.com/blog/CreatingYourOwnCustomPatternLayoutPatternParserAndPatternConvertorWithLog4net.aspx

カスタム PatternConverter のコードは次のようになります。

using System.IO;
using log4net.Util;

public class EncodedMessagePatternConvertor : PatternConverter
{
    protected override void Convert(TextWriter writer, object state)
    {
        var loggingEvent = state as log4net.Core.LoggingEvent;

        if (loggingEvent == null)
            return;

        // Replace newline characters with spaces
        var encodedMessage = loggingEvent.RenderedMessage.Replace("\r", " ").Replace("\n", " ");

        writer.Write(encodedMessage);
    }
}

カスタム PatternLayout のコードは次のようになります。

using log4net.Layout;
using log4net.Util;    

public class CustomPatternLayout : PatternLayout
{
    public CustomPatternLayout()
    {
        AddConverter(new ConverterInfo { Name = "encodedmessage", Type = typeof(EncodedMessagePatternConvertor) });
    }
}

アペンダーの構成は次のようになります。

<appender name="SomeAppender" type"...">
    ...
    <layout type="YourNamespace.CustomPatternLayout, YourAssemblyName">
      <conversionPattern value="%date %-5level %logger %encodedmessage %newline" />
    </layout>
</appender>

パターン名には「 encodedmessage 」を選びましたが、AddConverter 呼び出しと構成で変更することにより、任意の名前にすることができます。

このソリューションは、必要に応じて Convert メソッドのコードを変更することで、他のエンコード要件にも対応できるはずです。

于 2015-08-27T18:30:12.513 に答える