1

この例に従って、 log4net をプログラムで構成しています。ただし、情報とエラーを別々にログに記録したいので、セットアップ方法を次のように変更しました。

public static void Setup()
{
    Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

    PatternLayout patternLayout = new PatternLayout();
    patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
    patternLayout.ActivateOptions();

    RollingFileAppender info = new RollingFileAppender();
    info.AppendToFile = true;
    info.File = @"c:\Info\infolog.log";
    info.Layout = patternLayout;
    info.MaxSizeRollBackups = 5;
    info.MaximumFileSize = "1GB";
    info.RollingStyle = RollingFileAppender.RollingMode.Size;
    info.StaticLogFileName = true;
    info.ActivateOptions();
    info.Name = "info";



    RollingFileAppender error = new RollingFileAppender();
    error.AppendToFile = true;
    error.File = @"c:\Error\errorlog.log" ;
    error.Layout = patternLayout;
    error.MaxSizeRollBackups = 5;
    error.MaximumFileSize = "1GB";
    error.RollingStyle = RollingFileAppender.RollingMode.Size;
    error.StaticLogFileName = true;
    error.ActivateOptions();
    error.Name = "error";

    hierarchy.Root.AddAppender(info);
    hierarchy.Root.AddAppender(error);

    MemoryAppender memory = new MemoryAppender();
    memory.ActivateOptions();
    hierarchy.Root.AddAppender(memory);

    hierarchy.Root.Level = Level.Info;
    hierarchy.Configured = true;
}

私のコードでは、以下のように初期化しました

public class myclass
{
     ILog errorLog ;
     ILog infoLog ;
     public myclass()
     {
          errorLog = LogManager.GetLogger("error");
          infoLog = LogManager.GetLogger("info");       
     }


     public void LogMessage()
     {
         infoLog.Warn("warn message");
         errorLog.Error("Error message");
     }

}

問題は、infoLog に出力したものが、infolog.log ファイルと errorlog.log ファイルの両方に出力され、その逆も同様であることです。構成の何が問題になっていますか?

4

1 に答える 1

3

両方のファイル アペンダーをrootロガーに追加しました。これは、作成するすべてのロガーがそれを継承することを意味します。

あなたがする必要があるのは、適切なアペンダーで特定のロガーを取得できることです。configでロガーを定義できるのと同じ方法でロガーをプログラムで定義する方法はわかりませんが、それを回避する方法はあります。

1 つは、log4net がロガーをキャッシュするという事実を利用することです。ロガーを作成して一度構成すると、同じ名前のロガーを要求すると、構成されたロガーが返されます。

したがって、コードで、hierarchy.Configured = true;呼び出しの後にこれを追加します。

ILog log = LogManager.GetLogger("error");
Logger logger = (Logger)log.Logger;
logger.Additivity = false;
logger.AddAppender(error); 

log = LogManager.GetLogger("info");
logger = (Logger)log.Logger;
logger.Additivity = false;
logger.AddAppender(info); 

注:Additivity = falseロガーがその親 (この場合はルート ロガー) からアペンダーを継承しないように指示します。ルート ロガー構成を削除する場合、これは必要ありません。

于 2015-02-25T20:58:27.207 に答える