2010-08-18 198 views
23

我在写一个小文件转换工具。将文件放入目录时会自动进行转换。在NLog中运行时添加/删除日志文件

我正在使用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(); 

但没有创建日志文件。

我错了什么?任何想法?

回答

47

在此线程的第二个职位使我的解决方案: 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!"); 
+9

与重新分配的线是很重要的: LogManager.Configuration =配置; – habakuk 2011-05-04 10:14:15

+2

澄清 **具有重新分配的行非常重要:LogManager.Configuration = config; ** 这是因为NLog为配置属性编写了getter和setter的方式。这并不漂亮,但它必须再次设置一个更改的对象;你不能直接更改属性。 – zshift 2014-04-18 14:01:55

+0

我不得不在最后重新分配记录器变量以使其工作: logger = LogManager.GetCurrentClassLogger(); – Henry 2016-07-27 11:05:51