4

我在中配置了两个规则NLog.config

<logger name="Model" level="Info" writeTo="modelLog" final="true" />
<logger name="*" minlevel="Debug" writeTo="logFile" />

我正在尝试使用以下代码写入第一个:

LogEventInfo eventInfo = new LogEventInfo();
eventInfo.Level = LogLevel.Info;
eventInfo.LoggerName = "Model";
eventInfo.TimeStamp = DateTime.Now;
logger.Log(eventInfo);

但它一直落入第二条规则。我原以为eventInfo.LoggerName = "Model";会直接将其发送到第一条规则?

4

1 回答 1

4

现在不在电脑前,所以无法尝试您的案例,但我有几个问题。

  1. 您可以尝试使用“常规”日志记录功能(信息、调试)并查看是否可以按预期工作吗?

  2. 你是如何解决你的记录器的?那是。“记录者”的名字是什么?

如果实际记录器的名称不是“模型”,我的猜测是它不会满足“模型”条件,即使您在 LogEventInfo 的名称字段中传递“模型”。

[编辑] 这是一个可以在 Ninject Logging Extension 中使用的更好的 NLog 记录器包装器的缩写示例。此包装器以保留调用站点信息(记录请求发起的类和方法)的方式将记录调用委托给底层 NLog 记录器。

  class NLogLogger : ILogger
  {
    private NLog.Logger logger;

    //The Type that is passed in is ultimately the type of the current object that
    //Ninject is creating.  In the case of my example, it is Class1 and Class1 is
    //dependent on ILogger.
    public NLogLogger(Type t)
    {
      logger = NLog.LogManager.GetLogger(t.FullName);
    }

    //Trace, Warn, Error, Fatal eliminated for brevity

    public bool IsInfoEnabled
    {
      get { return logger.IsInfoEnabled; }
    }

    public bool IsDebugEnabled
    {
      get { return logger.IsDebugEnabled; }
    }

    public void Info(string format, params object [] args)
    {
      if (logger.IsInfoEnabled)
      {
        Write(LogLevel.Info, format, args);
      }
    }

    public void Debug(string format, params object [] args)
    {
      if (logger.IsDebugEnabled)
      {
        Write(LogLevel.Debug, format, args);
      }
    }

    private void Write(LogLevel level, string format, params object [] args)
    {
      LogEventInfo le = new LogEventInfo(level, logger.Name, null, format, args);
      logger.Log(typeof(NLogLogger), le);
    }
  }

显然这个例子没有处理异常。但是,我认为它说明了包装 NLog 的正确方法。实现完整的 Ninject Logging Extension ILogger 接口很容易,将每个 Info、Debug、Warn 等调用委托给一个中央 Write 方法,该方法将创建 LogEventInfo 类,然后使用底层 NLog 记录器实例记录它,传入包装记录器的类型(typeof(NLogLogger)在我的示例中)。传递包装记录器的类型对于维护来自应用程序代码的记录调用的调用站点信息至关重要。

基于Ninject Logging Extensions git repository中的 NLog 包装器。

更多关于依赖注入和命名记录器(如 NLog 和 log4net)。

See my answer here for more about problems with naive logger wrappers.

于 2010-10-16T02:43:57.790 回答