NLog记录器的日志级别未能启用

3
我创建了一个通用的ILogger实现,其中实现了NLog实现方法。我的问题是,我已经在解决方案中为整个命名空间启用了错误严重性,但我还希望在“员工”命名空间下为类启用Info级别的诊断功能,因此我又定义了另一条规则,使得该命名空间下的类符合Info级别的日志记录。但是当我仅记录这些命名空间下的类时,只有错误和致命错误被记录。当我调试时,我发现这些类的logger实例的IsInfoEnabled() 为false?我感觉我的包装器类配置方式似乎有缺陷?能否有人提供建议。
通用ILogger接口 public interface 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");
        }
    }

我有一个目标和两个规则来实现这个目标

    <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个回答

1

看起来您有一些问题:

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

    CommonLogger.GetLogger(typeof(MainTechDetails));

  2. 如所写,您的包装器将无法正确维护调用站点(如果使用NLog的调用站点LayoutRenderer)。与其获取您调用记录器的代码的调用站点,您将从记录器内部获取调用站点。那可能没有什么用处。请参见我在此问题中的答案,以了解如何包装NLog,以便保留调用站点:

Nlog Callsite is wrong when wrapper is used

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接