我有一个.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}"
}```
您有一些选择:
在所有情况下,您都需要在课程中使用该属性:
[Target("MyWrapper", IsWrapper = true)]
从WrapperTargetBase继承时,您的目标可能是异步的,但它也可以同步。您需要更多代码来处理它。
protected override void Write(AsyncLogEventInfo logEvent)
WrappedTarget.WriteAsyncLogEvent(logEvent);
写入目标继承自WrapperTargetBase的表单
protected override void Write(IList<AsyncLogEventInfo> logEvents)
AsyncHelpers
另一个选项是从目标Inherit
。因为您有[Target("MyWrapper", IsWrapper = true)]
,所以可以使用。您的班级需要这个:
/// <summary>
/// Gets or sets the target that is wrapped by this target.
/// </summary>
[RequiredParameter]
public Target WrappedTarget { get; set; }