Пользовательское форматирование строки записи журнала в NLog? - PullRequest
0 голосов
/ 06 мая 2020

Я новичок в NLog и хотел знать, есть ли способ, которым я могу писать записи журнала, отформатированные каким-то индивидуальным образом? Например, вот некоторые вещи, которые я хочу сделать со своими записями журнала:

-> Иметь вложенные сообщения записей журнала (исключая метаданные записей журнала), чтобы упростить отслеживание глубины стека вызовов журнала. Это можно сделать, сделав отступ в строке записи журнала пропорционально тому, насколько глубоко вы находитесь в стеке вызовов ведения журнала

-> Запишите «идентификатор изменения» (в основном какой-то идентификатор, связанный с некоторым обрабатываемым запросом) со всеми соответствующими записями журнала

Я знаю, что у NLog есть несколько шаблонов, которые вы можете использовать и прочее, но я бы предпочел иметь больше контроля в виде настраиваемого класса форматирования или чего-то еще, что будет перехватывать запрос на ведение журнала каждый раз Я делаю Log.Info(...), а затем форматирую строку записи журнала соответствующим образом в соответствии с выбранным мной поведением.

Возможно ли это?

EDIT:

Вот содержимое моего текущий файл NLog.config:

<?xml version="1.0" encoding="UTF-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" autoReload="true" throwExceptions="true" internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
   <targets>
      <target name="logfile" xsi:type="File" fileName="logfile.log" />
      <target name="logconsole" xsi:type="Console" />
   </targets>
   <rules>
      <logger name="*" minlevel="Trace" writeTo="logconsole" />
      <logger name="*" minlevel="Trace" writeTo="logfile" />
   </rules>
</nlog>

1 Ответ

0 голосов
/ 06 мая 2020

Один из способов - создать собственное средство визуализации макета.

Для этого есть 2 варианта:

Лямбда-метод

Создайте лямбда-методы и зарегистрируйте их перед загрузкой другого NLog вещи (остерегайтесь статики), например, в main ().

Лямбда получает LogEventInfo , который включает следующие свойства: Уровень, Сообщение (неформатированное), Форматированное сообщение, Параметры (отправить на Log.Info), необязательное исключение и свойства (именованные параметры)

//Create ${message-length}

// NLog 4.7+ syntax
NLog.LogManager.Setup().SetupExtensions(s =>
   s.RegisterLayoutRenderer("message-length", (logevent) => logEvent.FormattedMessage.Length)
);

Class

Если вам нужны дополнительные элементы управления и параметры, вы также можете создать класс, наследуемый от NLog.LayoutRenderers. LayoutRenderer

1. Настройка

/// <summary>
/// E.g. usage:  ${MyFormatter:MyLayout:${uppercase}} or ${MyFormatter:${uppercase}}
/// </summary>
[LayoutRenderer("MyFormatter")]
public class MyFormatterLayoutRenderer: LayoutRenderer
{
    [RequiredParameter]
    public Layout MyLayout { get; set; }

    protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    {
        var text = MyLayout.Render(logEvent);
        builder.Append(text);
    }
}

2. Зарегистрируйте

Вам необходимо зарегистрировать средство визуализации макета :

// NLog 4.7+ syntax
NLog.LogManager.Setup().SetupExtensions(s =>
   s.RegisterLayoutRenderer<MyNamespace.MyFormatterLayoutRenderer>("MyFormatter")
);

3. Использование

Используйте его следующим образом, установите атрибут макета цели. Например:

<target name="logfile" xsi:type="File" fileName="logfile.log" layout="${message-length} - ${level} - ${message} - ${exception}"  />
<target name="logconsole" xsi:type="Console" layout="${message-length} - ${level} - ${message} - ${exception}" />

Подробнее здесь

...