【问题标题】:How to log to two different files using NLog如何使用 NLog 记录到两个不同的文件
【发布时间】:2016-11-26 00:24:02
【问题描述】:

我有以下课程:

private string name;
private Logger logger;
private LogLevel lvl;
private LoggingConfiguration config;

public Logger(string name, string path, string format, LogLevel lvl)
{
    this.name = name;

    FileTarget fileTarget = new FileTarget();
    fileTarget.FileName = path;
    fileTarget.Layout = format;

    this.lvl = lvl;
    LoggingRule rule = new LoggingRule(name, lvl, fileTarget);

    config = new LoggingConfiguration();
    config.AddTarget(name, fileTarget);
    config.LoggingRules.Add(rule);

    LogManager.Configuration = config;

    logger = LogManager.GetLogger(this.name);
    logger.Trace("test");
 }

我像这样创建两个不同的记录器:

Logger("log1", "c:\\test\\log1.txt", ${message}, LogLevel.Debug);
Logger("log2", "c:\\test\\log2.txt", ${message}, LogLevel.Debug);

这两个文件都是用字符串 test 创建的。但是当我尝试使用(类方法)记录消息时:

public void Log(string msg)
{
    logger = NLog.LogManager.GetLogger(name);
    //LogManager.Configuration = config;
    //LogManager.Configuration.Reload();
    logger.Log(lvl, msg);
}

该消息仅记录在第二个文件中。我做错了什么?

【问题讨论】:

  • 您在上面的代码中为两个记录器使用了相同的文件名。
  • 这是一个拼写错误,抱歉,我更改了我使用的路径,并且在发布之前没有检查。无论如何,编辑了帖子。谢谢。

标签: c# .net logging nlog


【解决方案1】:

我不太确定,但据我所知,LogManager.Configuration 是一种全球性的,用于此后创建的所有记录器。因此,第二次调用 Logger() 函数会覆盖您在第一次调用期间所做的配置设置。这就是日志记录只发生在后面的文件中的原因。

要解决此问题,您必须先为它们创建文件目标和规则,然后将目标和规则添加到日志记录配置中。

所以基本方法(没有单独的函数)应该看起来像这样:(注意:代码尚未经过测试,所以复制和粘贴需要您自担风险!)

FileTarget fileTarget1 = new FileTarget();
fileTarget1.FileName = "C:\\foo\\bar1.txt";
fileTarget1.Layout = "${message}";

FileTarget fileTarget2 = new FileTarget();
fileTarget2.FileName = "C:\\foo\\bar2.txt";
fileTarget2.Layout = "${message}";

LoggingRule rule1 = new LoggingRule("log1", LogLevel.Debug, fileTarget1);
LoggingRule rule2 = new LoggingRule("log2", LogLevel.Debug, fileTarget2);

config = new LoggingConfiguration();
config.AddTarget("log1", fileTarget1);
config.LoggingRules.Add(rule1);
config.AddTarget("log2", fileTarget2);
config.LoggingRules.Add(rule2);

LogManager.Configuration = config;

logger = LogManager.GetLogger(this.name);
logger.Trace("test");

我将把如何将其放入某种可重用的函数/方法中的细节留给读者作为练习。 ;)

【讨论】:

  • 是的LogManager.Configurationstatic,所以配置是共享的和全局的。
  • @Julian:感谢您的澄清。
  • 对于高级用户,还可以选择使用多种配置,但如果不需要,不建议这样做。
【解决方案2】:

作为补充,

您可以创建两个记录规则,但另一种选择是使用 1 LoggingRule,并使文件路径依赖于记录器名称。

例如

FileTarget fileTarget = new FileTarget();
fileTarget.FileName = "${basedir}/${logger}.log";
fileTarget.Layout = "${message}";

LoggingRule rule1 = new LoggingRule("*", LogLevel.Debug, fileTarget);

var config = new LoggingConfiguration();
config.AddTarget("log1", fileTarget);
config.LoggingRules.Add(rule1);

LogManager.Configuration = config;

var logger1 = LogManager.GetLogger("logger1");
logger.Trace("im logger1 to logger1.log");


var logger2 = LogManager.GetLogger("logger2");
logger.Trace("im logger2 and going to logger2.log");

【讨论】:

  • 这可以通过NLog.config文件中的纯配置来实现吗?是否有可能只有 1 个类根据记录器名称使用多个文件,而应用程序的其余部分按正常方式使用记录?
  • 是的,NLog 中的每个配置都可以通过代码或配置完成!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多