能否在NLog AsyncWrapper丢弃日志时记录提示消息?
如何在NLog AsyncWrapper丢弃日志时记录通知
当AsyncWrapper的队列达到queueLimit触发Discard动作时,NLog本身没有直接提供内置的回调来记录自定义消息,但有两种可行的实现方式:
方法1:利用NLog内部日志(InternalLogger)
AsyncWrapper在丢弃日志时,会自动向NLog的InternalLogger输出警告级别的日志,内容类似AsyncWrapper queue overflow, discarding message。你可以配置InternalLogger将这些警告记录到文件或其他目标:
- 通过配置文件启用:
<nlog internalLogFile="nlog-internal.log" internalLogLevel="Warn" />
- 通过代码配置:
NLog.Common.InternalLogger.LogFile = "nlog-internal.log"; NLog.Common.InternalLogger.LogLevel = NLog.LogLevel.Warn;
配置完成后,所有队列溢出导致的日志丢弃事件都会被记录到指定的内部日志文件中。
方法2:自定义AsyncTargetWrapper子类
如果需要更灵活的自定义通知(比如发送告警、记录到特定业务日志),可以继承AsyncTargetWrapper并重写相关方法捕获丢弃事件:
public class TrackingAsyncWrapper : AsyncTargetWrapper { private static readonly ILogger _alertLogger = LogManager.GetLogger("DiscardAlert"); protected override bool EnqueuePendingMessage(AsyncLogEventInfo logEvent) { var enqueued = base.EnqueuePendingMessage(logEvent); // 确认是因队列溢出且动作是Discard导致的丢弃 if (!enqueued && OverflowAction == AsyncTargetWrapperOverflowAction.Discard) { // 使用独立日志器记录告警,避免递归阻塞 _alertLogger.Warn($"日志事件被丢弃:{logEvent.LogEvent.FormattedMessage}"); } return enqueued; } }
随后在NLog配置中注册并使用这个自定义包装器:
<extensions> <add assembly="你的程序集名称" /> </extensions> <targets> <target name="asyncWrapper" xsi:type="TrackingAsyncWrapper" queueLimit="1000" overflowAction="Discard"> <target xsi:type="File" fileName="app.log" /> </target> </targets>
注意:用于记录告警的日志器不要复用同一个AsyncWrapper,防止触发递归队列溢出。
内容的提问来源于stack exchange,提问作者Drago Rosson
相关产品推荐
相关产品推荐

