0

我有一个控制台应用程序,它目前使用 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 来提供逻辑?

4

4 回答 4

1

是的,例如:

<root>
  <level value="DEBUG" />
  <appender-ref ref="LogFileAppender" />
  <appender-ref ref="AdoNetAppender" />
  <appender-ref ref="EventLogAppender" />
</root>
于 2013-04-30T13:00:42.520 回答
0

如果您正在使用代码初始化 log4net,请将调试过滤器添加到 appender

  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();
        }
    }
于 2013-04-30T13:59:42.157 回答
0

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

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">
...
于 2013-04-30T13:30:16.127 回答
0

我没有对它进行广泛的测试,但你应该能够通过设置存储库的阈值来实现你想要的,如下所示:

var repository = LogManager.GetRepository();
if (repository != null)
{
    if (debug)
    {
        repository.Threshold = Level.Debug;
    }
    else
    {
        repository.Threshold = Level.Info;
    }
}
于 2013-05-04T12:47:45.120 回答