【发布时间】:2020-02-05 19:34:31
【问题描述】:
我了解 NLog 的 LogManager.Shutdown() 可以有效地删除所有日志记录项并停止日志记录。在此之后以编程方式删除锁定的日志文件应该可以,但我发现它并没有立即被删除,文件仍然被锁定,只有在进程结束后才会解锁。
这是我的程序化配置:
var fileTarget = new FileTarget()
{
FileName = "logs.txt",
Layout = <string layout>,
KeepFileOpen = true,
ArchiveAboveSize = 50000000,
ArchiveEvery = FileArchivePeriod.Day,
ArchiveNumbering = ArchiveNumberingMode.DateAndSequence,
ArchiveDateFormat = DatePattern
};
var asyncFileTarget =
new NLog.Targets.Wrappers.AsyncTargetWrapper(fileTarget, 10000, NLog.Targets.Wrappers.AsyncTargetWrapperOverflowAction.Block);
asyncFileTarget.Name = "async_target";
var config = new LoggingConfiguration();
config.AddTarget(asyncFileTarget);
config.AddRule(NLog.LogLevel.Debug, NLog.LogLevel.Fatal, asyncFileTarget);
如果我这样做了,
LogManager.Shutdown(); //logs get flushed and written to the file
File.Delete("logs.txt"); //Nothing happens, file deletes only after process exits
我也试过
LogManager.Configuration = null;
结果相同。
出于性能原因,我需要 KeepFileOpen = true。 如何让 NLog 释放锁定的目标文件?
【问题讨论】:
-
什么是 NLog 版本?内部日志中记录的内容(跟踪级别) - 请参阅 github.com/nlog/nlog/wiki/Internal-logging 以启用
-
我不知道这是否有帮助。文档说(强调我的):“keepFileOpen - 指示是否保持日志文件打开而不是在每个日志记录事件上打开和关闭它。将此属性更改为 true 将大大提高性能,但也会保持文件句柄锁定。启用此选项时考虑设置 openFileCacheTimeout = 30,因为它将允许归档操作并对被删除的日志文件做出反应。"
-
根据源码
LogManager.Shutdown只是清除配置;它实际上并没有关闭任何东西。如果你还有fileTarget的引用,你可以在告诉Nlog关闭后手动关闭。
标签: c# logging nlog delete-file