【发布时间】:2023-04-09 06:19:01
【问题描述】:
问题
我们如何在 NLog 中读取日志缓冲区的内容?
详情
我在我的应用程序中配置了一个普通的FileTarget 和一个BufferingTargetWrapper。每隔几分钟,我的应用程序就会运行一组步骤并在此过程中记录一些消息。我想继续缓冲这些消息并在流程结束时刷新它们。在刷新时,我还想通过电子邮件发送当前批次中的所有消息。然后将缓冲区刷新到主日志文件并为下一批做好准备。
我已经以编程方式配置了我的记录器:
/// <summary>
/// Initializes global logging service
/// </summary>
private void InitLogger()
{
var config = new LoggingConfiguration();
var fileTarget = new FileTarget("MyService")
{
FileName = "${basedir}/myservice.log",
Layout = "${longdate} ${level} ${message} ${exception}"
};
config.AddTarget(fileTarget);
var bufferTarget = new BufferingTargetWrapper("BufferLog", fileTarget);
config.AddRuleForAllLevels(bufferTarget);
LogManager.Configuration = config;
}
这是一个示例测试方法,它准确显示了我想要实现的目标:
public static Logger Log => LogManager.GetLogger("BufferLog");
[TestMethod]
public void BufferedLogTest()
{
InitLogger();
Log.Info("Message 1");
Log.Info("Message 2");
Log.Info("Message 3");
LogManager.Configuration.FindTargetByName<BufferingTargetWrapper>("BufferLog").Flush(new NLog.Common.AsyncContinuation((s) =>
{
//I want to send these 3 buffered messages through email and
//flush them to the main log file, but s is null unfortunately
}));
Log.Info("Message 4");
Log.Info("Message 5");
Log.Info("Message 6");
LogManager.Configuration.FindTargetByName<BufferingTargetWrapper>("BufferLog").Flush((s) =>
{
//I want to send next 3 buffered messages through email and
//flush them to the main log file, but s is null again
});
}
我的预期是BufferingTargetWrapper 会将其缓冲区的内容交给目标函数,但事实并非如此。也没有任何其他直接/间接访问缓冲区的方式。
【问题讨论】:
-
Flush(s => {})与Flush(exception => {})相同。所以s is null可以翻译成exception is null,意思是flush完成没有错误。 -
为什么不添加两个日志规则,每个规则都有自己的 BufferingTargetWrapper ?然后其中一个可以直接写入 FileTarget,另一个可以写入 MailTarget 或 MemoryTarget。另见github.com/nlog/NLog/wiki/Mail-target 和github.com/NLog/NLog/wiki/Memory-target
-
@RolfKristensen:谢谢。是的,我后来发现这个论点带来了冲洗时可能发生的异常。然而,您的第二条评论是一颗宝石。我应该想到那条线。感谢您的提示。