FileAppender で log4net を使用しています。レイアウトパターンは"%utcdate %message%newline"
ですので、メッセージはすべて1行です。
ただし、改行文字を含むメッセージには問題があります。ファイルに書き込む前に改行をエスケープすることは可能ですか?
質問する
4772 次
3 に答える
7
改行文字をエスケープするカスタム PatternConverter を作成できます。
これは、任意のアペンダーで使用できるため、他の回答よりも柔軟なソリューションを提供します。
これらの記事に従って、改行文字をスペースに置き換えるカスタム PatternConverter を実装しました。
https://dejanfajfar.wordpress.com/2011/04/14/log4net-custom-layoutpattern/
カスタム 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 に答える