Унаследовать NLog WrapperTargetBase для синхронного ведения журнала - PullRequest
1 голос
/ 04 мая 2020

У меня есть. NET Core 3.1 Web Service и я использую NLog 4.7.0 для ведения журнала. В настоящее время я использую ведение журнала файлов и файловый ритм, чтобы получать сообщения из файлов журнала на ELK.

Я хочу создать цель-оболочку для моего FileTarget. Фактическая цель состоит в том, чтобы объединить все журналы для одного веб-запроса в одно сообщение журнала, но это, вероятно, не относится к делу.

Я хочу наследовать от NLog.Targets.Wrappers.WrapperTargetBase, но метод Write(LogEventInfo logEvent) запечатан , Означает ли это, что я могу использовать asyn c logging только для WrapperTargets?

Влияет ли это на настройку конфигурации регистрации? Обратите внимание, что я использую файл конфигурации, а не API конфигурации, для конфигурации.

Мои существующие FileTarget выглядят так:

"appFile": {
    "type": "File",
    "fileName": "c:\\wwwlogs\\MyWebApp\\Combined.log",
    "archiveFileName": "c:\\wwwlogs\\MyWebApp.Web\\archives\\Combined.{#}.log",
    "archiveEvery": "Day",
    "archiveNumbering": "Rolling",
    "maxArchiveFiles": "7",
    "layout": "${longdate}|${aspnet-request-ip}|${aspnet-TraceIdentifier}|${aspnet-user-identity}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}"
  }```

1 Ответ

1 голос
/ 04 мая 2020

У вас есть несколько вариантов:

Во всех случаях вам нужен атрибут в вашем классе:

[Target("MyWrapper", IsWrapper = true)]

WrapperTargetBase отдельный элемент

При наследовании от WrapperTargetBase, ваша цель может быть asyn c, но также работает syn c. Вам нужно больше кода, чтобы справиться с этим.

  1. Наследовать от WrapperTargetBase
  2. переопределить protected override void Write(AsyncLogEventInfo logEvent)
  3. Запись в цель с помощью WrappedTarget.WriteAsyncLogEvent(logEvent);

Когда не используется WriteAsyncLogEvent, пожалуйста, не звоните logEvent.Continuation (с исключением или нулем)

WrapperTargetBase сгруппированы

Запись событий сгруппированы

  1. Наследовать от WrapperTargetBase
  2. override protected override void Write(IList<AsyncLogEventInfo> logEvents)
  3. Пишите с помощью al oop или используйте AsyncHelpers

Target

Другой вариант - Inherit из Target. Это более простой подход, но он не работает с Asyn c из коробки. Поскольку у вас есть [Target("MyWrapper", IsWrapper = true)], это работает. Вам нужно это в вашем классе:

/// <summary>
/// Gets or sets the target that is wrapped by this target.
/// </summary>
[RequiredParameter]
public Target WrappedTarget { get; set; }
...