如何在消息中转义换行符?

Ste*_*ero 6 .net log4net

我将Log4net与FileAppender一起使用。布局模式为"%utcdate %message%newline",因此每条消息占用1行。
但是,包含换行符的消息存在问题。写入文件前是否可以转义新行?

Ava*_*his 6

您可以创建一个自定义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);
    }
}
Run Code Online (Sandbox Code Playgroud)

自定义PatternLayout的代码如下所示:

using log4net.Layout;
using log4net.Util;    

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

附加程序配置应如下所示:

<appender name="SomeAppender" type"...">
    ...
    <layout type="YourNamespace.CustomPatternLayout, YourAssemblyName">
      <conversionPattern value="%date %-5level %logger %encodedmessage %newline" />
    </layout>
</appender>
Run Code Online (Sandbox Code Playgroud)

我为模式名称选择了“ encodingmessage ”,但是您可以通过在AddConverter调用和配置中对其进行更改来随意命名。

通过更改Convert方法中的代码以适合您的需求,该解决方案应该可以满足其他编码要求。