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 を初期化する場合は、アペンダーにデバッグ フィルターを追加します。

  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

私はそれを広範囲にテストしませんでしたが、次のようにリポジトリのしきい値を設定することで、あなたが望むものを達成できるはずです:

var repository = LogManager.GetRepository();
if (repository != null)
{
    if (debug)
    {
        repository.Threshold = Level.Debug;
    }
    else
    {
        repository.Threshold = Level.Info;
    }
}
于 2013-05-04T12:47:45.120 に答える
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 に答える