继承 NLog WrapperTargetBase 用于同步日志记录

Inherit NLog WrapperTargetBase for synchronous logging

我有一个 .NET Core 3.1 Web 服务并使用 NLog 4.7.0 进行日志记录。我目前正在使用文件日志记录和 filebeat 将消息从日志文件获取到 ELK。

我想为我的 FileTarget 创建一个包装器目标。实际目的是将单个 Web 请求的所有日志合并到单个日志消息中,但这可能不是重点。

想继承NLog.Targets.Wrappers.WrapperTargetBase,但是Write(LogEventInfo logEvent)方法被封了。这是否意味着我只能对 WrapperTargets 使用异步日志记录?

这会影响我设置日志记录配置的方式吗?请注意,我使用的是配置文件,而不是配置 API,用于 config.

我现有的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}"
  }```

您有一些选择:

在所有情况下,您都需要 class:

中的属性
[Target("MyWrapper", IsWrapper = true)]

WrapperTargetBase 单项

从 WrapperTargetBase 继承时,您的目标可能是异步的,但它也可以同步工作。您需要更多代码来处理它。

  1. 继承自 WrapperTargetBase
  2. 覆盖 protected override void Write(AsyncLogEventInfo logEvent)
  3. 使用 WrappedTarget.WriteAsyncLogEvent(logEvent);
  4. 写入目标

当不使用 WriteAsyncLogEvent 时,请不要调用 logEvent.Continuation(有例外或 null)

WrapperTargetBase 分组

写入事件分组

  1. 继承自 WrapperTargetBase
  2. 覆盖 protected override void Write(IList<AsyncLogEventInfo> logEvents)
  3. 用循环写或者用AsyncHelpers

目标

另一种选择是 Inherit 来自 Target。这是一种更简单的方法,但它不适用于开箱即用的 Async。 因为你有 [Target("MyWrapper", IsWrapper = true)],所以这行得通。您的 class:

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