How to avoid newlines in a message?

I am using log4net with FileAppender. Layout template "%utcdate %message%newline", so each message takes 1 line.
However, there is a problem with messages containing new string characters; Is it possible to avoid new lines before writing to a file?

+4
source share
2 answers

You can create your own template that eludes newline characters.

This provides a more flexible solution than another answer, because you can use it with any application.

I followed these articles to implement my own template converter, which replaces newline characters with spaces:

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 :

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

"encodedmessage" , , AddConverter .

, Convert .

+3

:

class MyFileAppender : FileAppender
{
    protected override void Append(LoggingEvent loggingEvent)
    {
        var val = Convert(loggingEvent);
        base.Append(val);
    }

    protected override void Append(LoggingEvent[] loggingEvents)
    {
        var vals = loggingEvents.Select(Convert).ToArray();
        base.Append(vals);
    }

    private static LoggingEvent Convert(LoggingEvent loggingEvent)
    {
        var eventData = loggingEvent.GetLoggingEventData();
        eventData.ExceptionString = Convert(eventData.ExceptionString);
        eventData.Message = Convert(eventData.Message);
        var val = new LoggingEvent(eventData);
        return val;
    }

    static string Convert(object val)
    {
        var res = val.ToString().Replace("\r", "\\r").Replace("\n", "\\n");
        return res;
    }
}
+1

All Articles