继承 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 继承时,您的目标可能是异步的,但它也可以同步工作。您需要更多代码来处理它。
- 继承自 WrapperTargetBase
- 覆盖
protected override void Write(AsyncLogEventInfo logEvent)
- 使用
WrappedTarget.WriteAsyncLogEvent(logEvent);
写入目标
当不使用 WriteAsyncLogEvent
时,请不要调用 logEvent.Continuation
(有例外或 null)
WrapperTargetBase 分组
写入事件分组
- 继承自 WrapperTargetBase
- 覆盖
protected override void Write(IList<AsyncLogEventInfo> logEvents)
- 用循环写或者用
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; }
我有一个 .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 继承时,您的目标可能是异步的,但它也可以同步工作。您需要更多代码来处理它。
- 继承自 WrapperTargetBase
- 覆盖
protected override void Write(AsyncLogEventInfo logEvent)
- 使用
WrappedTarget.WriteAsyncLogEvent(logEvent);
写入目标
当不使用 WriteAsyncLogEvent
时,请不要调用 logEvent.Continuation
(有例外或 null)
WrapperTargetBase 分组
写入事件分组
- 继承自 WrapperTargetBase
- 覆盖
protected override void Write(IList<AsyncLogEventInfo> logEvents)
- 用循环写或者用
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; }