NLog记录器未启用日志级别

时间:2013-12-13 17:19:20

标签: nlog

我创建了一个通用的实现ILogger,并在这个包装器中实现了NLog实现方法。 我的问题是我在我的解决方案中为整个namspace启用了错误严重性,但我也希望在“Employee”命名空间下对类进行信息级别诊断,因此我有另一个规则,它将此命名空间下的类设置为Info级别日志记录。但是,当我只记录错误时,会在这些命名空间下的类中记录致命错误。当我调试时,我可以看到这些类的记录器实例的IsInfoEnabled()为false? 我觉得他们配置我的包装类似乎有问题吗? 有人可以建议。

通用ILogger接口     公共接口ILogger     {

    bool Trace(string message, params String[] args);


    bool Info(string message, params String[] args);


    bool Error(string message, params String[] args);


    bool Fatal(string message, params String[] args);


    bool Error(string message, Exception ex, String[] args);


    bool Fatal(string message, Exception ex, params String[] args);
}

ILogger接口的实现

 using NLog;

 class NLogImpl :  ILogger
 {  

     NLog.Logger logger = null; 


    public NLogImpl(string source)
    {
        logger = LogManager.GetLogger(source);
    }        


    bool ILogger.Trace(string message ,params String[] args)
    {

        logger.Trace(BuildArgumentsWithMessage(message , args));
        return true;
    }...

使用通用ILogger的类 此类仅记录错误和致命消息,但不记录任何其他级别,即使在配置文件中我已启用Info此命名空间

  public class MainTechDetails
   {
      private static ILogger logger = CommonLogger.GetLogger("MainTechDetails");

      public void LogMainTechDetails()
       {
         logger.Trace("Sample trace message");
         logger.Info("Sample informational message");
         logger.Error("Sample error message");
         logger.Fatal("Sample fatal error message");
        }
    }

我有一个目标和2个规则用于此目标

    <target xsi:type="File"
            name="logFile"
            fileName="D:\LogInformation.log"
            layout="${date} ${callsite} ${message}"/>
    </targets>

    <rules>
     <logger name="CustomLoggingNlog.Employee.*" minlevel="Info" writeTo="logFile" />
     <logger name="*" minlevel="Error" writeTo="logFile"/>    
    </rules>

1 个答案:

答案 0 :(得分:1)

看起来你有一些问题:

  1. 您已为“CustomLoggingNLog.Employee。”和“”配置了日志记录规则。在示例应用程序中,您将检索名为“MainTechDetails”的记录器。您应该根据完全命名空间限定名称检索记录器:CustomLoggingNLog.Employee.MainTechDetails。或者,如果您通用实现允许它,请使用类型:

    CommonLogger.GetLogger(typeof运算(MainTechDetails));

  2. 您所写的包装器将无法正确维护呼叫站点(如果您使用NLog的呼叫站点LayoutRenderer)。您可以从记录器内部获取呼叫站点,而不是将代码的呼叫站点发送到您呼叫记录器的位置。这可能不是很有用。有关如何包装NLog以保留呼叫站点的示例,请参阅此问题中的答案:

  3. Nlog Callsite is wrong when wrapper is used

    祝你好运!