我将Log4net与FileAppender一起使用。布局模式为"%utcdate %message%newline",因此每条消息占用1行。
但是,包含换行符的消息存在问题。写入文件前是否可以转义新行?
您可以创建一个自定义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);
}
}
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方法中的代码以适合您的需求,该解决方案应该可以满足其他编码要求。