将来自多个目标的日志复制到单个目标中

时间:2017-03-08 22:07:24

标签: c# nlog

我有多个文件目标:

var config = new LoggingConfiguration();
for (int i = 1; i <= 5; i++)
{
    var fileTarget = new FileTarget();
    fileTarget.Layout = @"${date:format=dd-MM HH\:mm\:ss}[${var:passNumber" + i.ToString() + "}][${var:TestName" + i.ToString() + "}] - ${message}";

    fileTarget.FileName = string.Format(@"log-cell{0}.txt", i);
    fileTarget.KeepFileOpen = false;
    config.AddTarget(string.Format("file{0}", i), fileTarget);

    var ruleFile = new LoggingRule(string.Format("{0}", i), LogLevel.Debug, fileTarget);
    config.LoggingRules.Add(ruleFile);
}
LogManager.Configuration = config;

然后我可以访问个别规则并写入相应的目标:

LogManager.Configuration.Variables["passNumber1"] = 33.ToString();
LogManager.Configuration.Variables["TestName1"] = "Test1";
LogManager.GetLogger("1").Debug("Test1");

LogManager.Configuration.Variables["passNumber2"] = 44.ToString();
LogManager.Configuration.Variables["TestName2"] = "Another Test";
LogManager.GetLogger("2").Debug("Test2");

这很好,并为每个规则创建不同的文件。现在我想要的还有单RichTextBoxTarget或者通常让我们说特殊目标:

  • 所有可能的日志将重复或仅达到选择级别
  • 布局将包含与文件目标
  • 相同的格式/变量

我不确定如何使用多个布局的单个目标。我的尝试是将以下内容添加到循环中

var ruleWnd = new LoggingRule(string.Format("{0}", i), LogLevel.Debug, rtTarget);
config.LoggingRules.Add(ruleWnd);

当然会记录消息,但我正在丢失变量。 所以问题是如何添加单个目标,它将捕获所有日志(或级别控制器),包括已定义的变量。

1 个答案:

答案 0 :(得分:0)

  

所以问题是如何添加单个目标,它将捕获所有日志(或级别控制器),包括已定义的变量。

变量属于全局级别,因此您只能使用一个。

在这种情况下&#34;事件属性&#34;是你正在寻找的地方。用法:

Logger logger = LogManager.GetCurrentClassLogger();
LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", "Test1");
theEvent.Properties["passNumber"] = 33;
logger.Debug(theEvent);

在您的配置中使用:

${event-properties:item=passNumber} 

请参阅${event-properties} docs