我试图通过NLog MailTarget登录.它运行得很好,但我想用mail BufferedTargetWrapper缓冲日志消息包装mailtarget,直到预定义的代码点,我想手动刷新缓冲区并通过单个邮件发送当前缓冲的日志消息(如邮件目标中定义的那样) ).
如果我定义FlushTimeout或BufferSize在的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将所有记录的消息刷新到包装目标(通过邮件发送)?
在此线程中 -当调用 Flush() 时,NLog 是否应该刷新 AsyncTargetWrapper 中的所有排队消息?- 我读到 \xe2\x80\x9eLogManager在域卸载或进程退出\xe2\x80\x9c 时将配置设置为 null(请参阅第一个答案中的编辑部分)。根据我的理解,这应该会导致所有待处理的日志条目被写入已注册的目标。然而,在FileTarget用wrapped with进行测试后AsyncTargetWrapper,这并不成立。我在 GitHub 上创建了一个最小的重现 - https://github.com/PaloMraz/NLogMultiProcessTargetsSample,其工作原理如下:
LogLib是一个.netstandard2.0引用NLog4.6.8 NuGet 包并公开一个CompositeLogger以编程方式配置NLog目标的类的库:
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)