【问题标题】:log4net log debug messages only if debug variable is set仅当设置了调试变量时,log4net 才会记录调试消息
【发布时间】:2013-04-24 09:48:52
【问题描述】:

我有一个控制台应用程序,它目前使用 log4net 设置将信息记录到控制台输出。

我有各种 log.Debug("Debug info") 语句,如果我的应用程序中设置了调试标志,我只想将它们打印到控制台。

调试变量是通过读取调用时传递给应用程序的开关来设置的。使用NDesk.Options 读取参数。

我想避免将每个调试语句都包装在 if:-

bool debug = false;

// read switches        
var p = new OptionSet() {
    { "d|debug", "debug mode", v => debug = v != null },
};

if (debug) {
    log.Debug("Debug info")
}

我可以在配置的<log4net><appender> 部分中添加什么来启用此功能,还是有办法覆盖 log.Debug 以提供逻辑?

【问题讨论】:

  • 你可以使用日志级别,见other post
  • 这是静态的吗?我想根据调用时传递给应用程序的开关以编程方式选择日志记录级别。
  • 您的意思是您的应用程序中的调试标志以编程方式设置或取消设置?
  • 是的。根据调用时是否将 --debug 传递给应用程序,布尔调试设置为 true 或 false。如果有任何区别,我正在使用 NDesk.Options 来解析参数。

标签: c# log4net ndesk.options


【解决方案1】:

我没有对它进行广泛的测试,但是您应该能够通过像这样设置存储库的阈值来实现您想要的:

var repository = LogManager.GetRepository();
if (repository != null)
{
    if (debug)
    {
        repository.Threshold = Level.Debug;
    }
    else
    {
        repository.Threshold = Level.Info;
    }
}

【讨论】:

    【解决方案2】:

    如果您使用代码初始化 log4net,请在附加程序中添加调试过滤器

      private static void InitFileLogging(bool logDebugEvents)
        {
            string LOG_PATTERN = "%d [%t][%logger] %-5p %m%n";
    
            Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
            TraceAppender tracer = new TraceAppender();
            PatternLayout patternLayout = new PatternLayout();
    
            patternLayout.ConversionPattern = LOG_PATTERN;
            patternLayout.ActivateOptions();
            tracer.Layout = patternLayout;
    
    
            tracer.ActivateOptions();
    
            hierarchy.Root.AddAppender(tracer);
    
            RollingFileAppender roller = new RollingFileAppender
            {
                Layout = patternLayout,
                AppendToFile = true,
                RollingStyle = RollingFileAppender.RollingMode.Size,
                MaxSizeRollBackups = 4,
                MaximumFileSize = "300KB",
                StaticLogFileName = true,
                File = @"c:\temp\textLog.txt"
            };
            if (!logDebugEvents)
            {
                log4net.Filter.LevelMatchFilter debugFilter = new log4net.Filter.LevelMatchFilter() { AcceptOnMatch = false, LevelToMatch = Level.Debug };
                roller.AddFilter(debugFilter);
            }
            roller.ActivateOptions();
    
    
            hierarchy.Root.AddAppender(roller);
    
           // hierarchy.Root.Level = Level.All;
            hierarchy.Configured = true;
    
        }
    

    如果您使用外部配置文件,请获取附加程序并添加调试过滤器。

     private static void DisableDebugFileLogging()
        {
            XmlConfigurator.Configure();
            Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
            foreach (var appender in hierarchy.GetAppenders())
            {
    
                RollingFileAppender rolAppender = appender as RollingFileAppender; //or whatever appender you use
                if (rolAppender != null)
                {
                    log4net.Filter.LevelMatchFilter debugFilter = new log4net.Filter.LevelMatchFilter() { AcceptOnMatch = false, LevelToMatch = Level.Debug };
                    rolAppender.AddFilter(debugFilter);
                }
                rolAppender.ActivateOptions();
            }
        }
    

    【讨论】:

      【解决方案3】:

      您可以尝试像这样创建自己的附加程序:

      public class MyAppender : AppenderSkeleton    
      {
          private static bool TurnDebugOn = false;
          public static SetDebugLogging(bool toSet){
              TurnDebugOn = toSet;
          }
      
          protected override void Append(LoggingEvent loggingEvent)
          {
              bool logEvent = true;
              LogLevel logLevel = LogLevel.Err;
              switch (loggingEvent.Level.Name)
              {
                  case "DEBUG":
                      logEvent = TurnDebugOn;
                      logLevel = LogLevel.Debug;
                      break;
                  case "WARN":
                  case "INFO":
                      logLevel = LogLevel.Info;
                      break;
                  case "ERROR":
                      logLevel = LogLevel.Err;
                      break;
                  case "FATAL":
                      logLevel = LogLevel.Critical;
                      break;
              }
              if(logEvent){
                  LogService.Log(LogNameEnum.Exception, LogCategoryEnum.BusinessLogic, logLevel, RenderLoggingEvent(loggingEvent));
              }
          }
      } 
      

      然后在你的代码中:

      MyAppender.SetDebugLogging(true);
      

      在您的配置文件中:

      ...
      <appender name="AppenderToUse" type="MyAppender">
      ...
      

      【讨论】:

        【解决方案4】:

        是的,例如:

        <root>
          <level value="DEBUG" />
          <appender-ref ref="LogFileAppender" />
          <appender-ref ref="AdoNetAppender" />
          <appender-ref ref="EventLogAppender" />
        </root>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-09
          • 1970-01-01
          • 1970-01-01
          • 2017-11-02
          • 1970-01-01
          相关资源
          最近更新 更多