【问题标题】:Inherit NLog WrapperTargetBase for synchronous logging继承 NLog WrapperTargetBase 用于同步日志记录
【发布时间】:2020-05-04 08:41:56
【问题描述】:

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

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

我想从NLog.Targets.Wrappers.WrapperTargetBase 继承,但是Write(LogEventInfo logEvent) 方法是密封的。这是否意味着我只能对 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}"
  }```

【问题讨论】:

    标签: c# nlog


    【解决方案1】:

    你有一些选择:

    在所有情况下,您都需要类中的属性:

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

    WrapperTargetBase 单项

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

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

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

    WrapperTargetBase 分组

    编写事件分组

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

    目标

    另一个选项是从 Target 发送 Inherit。这是一种更简单的方法,但它不适用于开箱即用的 Async。 因为你有[Target("MyWrapper", IsWrapper = true)],所以这行得通。你在课堂上需要这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      相关资源
      最近更新 更多