Пользовательский PatternLayoutConverter с log4net.Ext.Json? - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть следующая конфигурация log4net:

<log4net>
    <appender name="Console" type="log4net.Appender.ConsoleAppender">
        <layout type='log4net.Layout.SerializedLayout, log4net.Ext.Json'>
            <renderer type='log4net.ObjectRenderer.JsonDotNetRenderer, log4net.Ext.Json.Net'>
                <DateFormatHandling value="IsoDateFormat" />
                <NullValueHandling value="Ignore" />
            </renderer>
            <converter>
              <name value="preparedMessage" />
              <type value="JsonLogs.CustomLayoutConverter" />
            </converter>
            <default />
            <remove value='message' />
            <remove value='ndc' />
            <member value='message:messageObject' />
            <member value='details:preparedMessage' />
        </layout> 
    </appender>

    <appender name="Console2" type="log4net.Appender.ConsoleAppender">
        <layout type="log4net.Layout.PatternLayout">
            <converter>
              <name value="preparedMessage" />
              <type value="JsonLogs.CustomLayoutConverter" />
            </converter>
            <conversionPattern value="%level %thread %logger - %preparedMessage%newline" />
        </layout>
    </appender>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="Console" />
        <appender-ref ref="Console2" />
    </root>
</log4net>

со следующей реализацией моей настройки PatternLayoutConverter:

namespace JsonLogs
{
    using System.IO;

    using log4net.Core;
    using log4net.Layout.Pattern;

    public class CustomLayoutConverter : PatternLayoutConverter
    {
        #region Methods

        protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            if (loggingEvent.MessageObject is string stringMessage)
            {
                writer.Write(new { message = stringMessage });
            }
            else
            {
                writer.Write(loggingEvent.RenderedMessage);
            }
        }

        #endregion
    }
}

По какой-то причине конвертер работает отлично сПриложение Console2 (которое не управляется JSON), но не работает с приложением Console, вывод которого - JSON.Пример вывода:

Console -> {"date":"2018-12-09T12:25:28.0529041+03:00","level":"INFO","appname":"JsonLogs.exe","logger":"JsonLogs.Program","thread":"1","message":"Test","details":"preparedMessage"}
Console2 -> INFO 1 JsonLogs.Program - { message = Test }

Моя цель - иметь details всегда в JSON, поэтому я ввел свой собственный конвертер, чтобы перехватывать примитивные значения и оборачивать их в пользовательский объект.

Моя конфигурация неверна?Или я что-то упустил?Не могли бы вы помочь мне разобраться?

Спасибо

1 Ответ

0 голосов
/ 14 декабря 2018

Кажется, проблема в ошибке log4net.Ext.Json.Я собираюсь сообщить об этом на их GitLab.До сих пор я получил свой собственный макет log4net, который выглядит так:

public class CustomLayout : PatternLayout
{
    #region Public Methods and Operators

    public override void Format(TextWriter writer, LoggingEvent loggingEvent)
    {
        var message = loggingEvent.MessageObject.GetType().IsPrimitive || loggingEvent.MessageObject is string || loggingEvent.MessageObject is decimal || loggingEvent.MessageObject is BigInteger
            ? new { message = loggingEvent.MessageObject }
            : loggingEvent.MessageObject;

        writer.WriteLine(JsonConvert.SerializeObject(new
        {
            timestamp = loggingEvent.TimeStampUtc,
            threadId = loggingEvent.ThreadName,
            details = message,
            logger = loggingEvent.LoggerName,
            level = loggingEvent.Level.DisplayName,
            user = loggingEvent.UserName
        }));
    }

    #endregion
}

, он отвечает моим потребностям и делает именно то, что я хочу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...