相关疑难解决方法(0)

在NLog中缓冲日志消息并手动将它们刷新到目标

我试图通过NLog MailTarget登录.它运行得很好,但我想用mail BufferedTargetWrapper缓冲日志消息包装mailtarget,直到预定义的代码点,我想手动刷新缓冲区并通过单个邮件发送当前缓冲的日志消息(如邮件目标中定义的那样) ).

如果我定义FlushTimeoutBufferSize在的BufferedTargetWrapper一切,应该还是工作得很好.但是如果没有设置FlushTimeout和BufferSize,我就无法使它工作.

就像在SO Force BufferingTargetWrapper上的这个问题中回答的那样,我没有这样的东西:

 LogManager.Configuration.AllTargets.Where(t => t != null && t is BufferingTargetWrapper).ToList().
            ForEach(b => ((BufferingTargetWrapper)b).Flush(null));
Run Code Online (Sandbox Code Playgroud)

但是文档和这个答案与我的NLog版本(2.0.0.2000)相矛盾.没有参数的flush方法,只有异步目标的flush方法.

有没有办法强制BufferingTargetWrapper将所有记录的消息刷新到包装目标(通过邮件发送)?

c# logging nlog buffering wrapper

10
推荐指数
1
解决办法
5096
查看次数

NLog 不会在进程退出时刷新所有日志条目

在此线程中 -当调用 Flush() 时,NLog 是否应该刷新 AsyncTargetWrapper 中的所有排队消息?- 我读到 \xe2\x80\x9eLogManager在域卸载或进程退出\xe2\x80\x9c 时将配置设置为 null(请参阅第一个答案中的编辑部分)。根据我的理解,这应该会导致所有待处理的日志条目被写入已注册的目标。然而,在FileTarget用wrapped with进行测试后AsyncTargetWrapper,这并不成立。我在 GitHub 上创建了一个最小的重现 - https://github.com/PaloMraz/NLogMultiProcessTargetsSample,其工作原理如下:

\n\n

LogLib是一个.netstandard2.0引用NLog4.6.8 NuGet 包并公开一个CompositeLogger以编程方式配置NLog目标的类的库:

\n\n
public class CompositeLogger\n{\n  private readonly ILogger _logger;\n\n  public CompositeLogger(string logFilePath)\n  {\n    var fileTarget = new FileTarget("file")\n    {\n      FileName = logFilePath,\n      AutoFlush = true\n    };\n    var asyncTargetWrapper = new AsyncTargetWrapper("async", fileTarget)\n    {\n      OverflowAction = AsyncTargetWrapperOverflowAction.Discard\n    };\n\n    var config = new LoggingConfiguration();\n    config.AddTarget(asyncTargetWrapper);\n …
Run Code Online (Sandbox Code Playgroud)

.net c# logging nlog multiprocessing

1
推荐指数
1
解决办法
3569
查看次数

标签 统计

c# ×2

logging ×2

nlog ×2

.net ×1

buffering ×1

multiprocessing ×1

wrapper ×1