在NLog中运行时添加/删除日志文件

32

我正在编写一个小的文件转换工具。当文件被拖放到目录中时,它们会自动转换。

我正在使用NLog进行日志记录。除了使用 NLog.conf 配置的中央日志文件(接收所有生成的消息),我还想创建一个附加的日志文件,与输入文件具有类似的名称,并包含在转换过程中编写的所有日志消息。

不幸的是,我似乎无法找出如何在运行时正确添加新的文件目标以及适当的规则。我希望所有的Logger对象在转换过程中都写入新的日志文件。

我尝试了一些方式:

var logfile = new NLog.Targets.FileTarget();
logfile.FileName = fileName + ".log";
logfile.KeepFileOpen = true;
logfile.Initialize();
var rule = new NLog.Config.LoggingRule("*", logfile);
NLog.LogManager.Configuration.LoggingRules.Add(rule);
NLog.LogManager.ReconfigExistingLoggers();
//
// Proceed with converting file
//
logfile.Flush();
NLog.LogManager.Configuration.LoggingRules.Remove(rule);
NLog.LogManager.ReconfigExistingLoggers();

但是没有创建日志文件。

我做错了什么?有任何想法吗?

1个回答

64

这个帖子的第二篇回复指引我找到了解决方法:http://nlog-project.org/forum.html#nabble-td1685349

你需要获取当前的NLog配置,对这个LoggingConfiguration对象进行更改,然后将其重新分配给LogManager.Configuration。

这是我使用的代码:

LoggingConfiguration config = LogManager.Configuration;

var logFile = new FileTarget();
config.AddTarget("file", logFile);

logFile.FileName = fileName + ".log";
logFile.Layout = "${date} | ${message}";

var rule = new LoggingRule("*", LogLevel.Info, logFile);
config.LoggingRules.Add(rule);

LogManager.Configuration = config;

logger.Info("File converted!");

10
这行代码非常重要:LogManager.Configuration = config; 它重新分配了LogManager的Configuration属性。 - habakuk
4
为了澄清,重新赋值的那行非常重要:LogManager.Configuration = config;。这是因为 NLog 为 Configuration 属性编写 getter 和 setter 的方式。虽然不太美观,但必须使用更改后的对象再次设置它,不能直接更改该属性。 - zshift
2
非常清晰的解决方案,谢谢。我更喜欢直接将文件名提供给FileTarget。string filename = string.Format("C:\\LogFile-{0:yyyy-MM-dd_hh-mm-ss-tt}", DateTime.Now); var logFile = new FileTarget(filename); config.AddTarget(logFile);也可以使用更短的用法。 - aozan88
6
如果您更喜欢更干净的C#代码(例如,避免回答为什么将类引用复制回自身以调用“魔术”属性设置器这样令人不安的问题),那么请使用**LogManager.ReconfigExistingLoggers();替换LogManager.Configuration = config;**。 - stoj
2
@aozan88 new FileTarget(filename) 设置的是目标的名称,而不是文件名。 - Alex Fainshtein
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接