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

Mar*_*ner 29 .net c# logging 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();
Run Code Online (Sandbox Code Playgroud)

但是没有创建日志文件.

我错了什么?任何的想法?

mat*_*404 58

这篇帖子的第二篇文章让我得到了解决方案: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!");
Run Code Online (Sandbox Code Playgroud)

  • 重新分配的行非常重要:LogManager.Configuration = config; (9认同)
  • 如果您更喜欢更清晰的c#代码(例如,避免回答为什么类引用被复制回自身以调用'魔术'属性设置器)的不舒服的问题,那么用**替换**LogManager.Configuration = config;**LogManager.ReconfigExistingLoggers();** (5认同)
  • 澄清**重新分配的行非常重要:LogManager.Configuration = config;**这是正确的,因为NLog已经为Configuration属性编写了getter和setter.它不漂亮,但必须用更改的对象再次设置; 你不能直接改变财产. (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);`也可以是更短的用法. (2认同)
  • @ aozan88 new FileTarget(filename)设置目标的名称,而不是fileName. (2认同)