与特定NLog记录器名称匹配的问题

时间:2010-10-16 00:48:13

标签: nlog

我在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";会把它直接送到第一条规则吗?

1 个答案:

答案 0 :(得分:3)

现在不在电脑上所以不能试试你的情况,但我有几个问题。

  1. 您是否可以尝试使用“常规”日志记录功能(信息,调试),看看它是否符合预期效果?

  2. 您是如何解决记录器的?那是。什么是“记录器”的名称?

  3. 如果实际记录器的名称不是“Model”,我的猜测是它不符合“Model”条件,即使你在LogEventInfo的Name字段中传递“Model”。

    [编辑] 这是一个更好的NLog记录器包装器的缩写示例,可以在Ninject Logging Extension中使用。此包装器以一种保留调用站点信息(发出日志记录请求的类和方法)的方式将日志记录调用委托给底层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包装器。

    More about dependency injection and named loggers (like NLog and log4net).

    有关天真记录器包装器问题的更多信息,请参阅我的回答here