Log4netのFileAppenderでFile(ファイル名)を動的に変更する

やってみたら出来たので書いておく。

Log4netの設定ファイル(log4net.configなど)に、以下のようなアペンダ定義があったとしよう。


    
    
    
    
    
    
    
    
        
    

100KBを境にファイル"MyApp.Log"をローリングするRollingFileAppenderの設定だ。
これをテンプレートにして、アペンダの記述を変えずに、出力されるログファイルを実行アセンブリのアセンブリ名にしたい。つまりは、全てのアプリケーションで共通なアペンダ定義を使い、それでいてログのファイル名はアプリケーションごとに勝手に変わって欲しいわけだ。

このような場合はLog4netの初期化の後などに、以下のようなコードを用意すればよい。

//初期化が済んでいないとリポジトリは空のままなので注意
XmlConfigurator.Configure(LogManager.GetRepository(), 〜);

Assembly entryAsm = Assembly.GetEntryAssembly();
if (entryAsm != null)
{
    foreach (ILoggerRepository repository in LogManager.GetAllRepositories())
    {
        foreach (IAppender appender in repository.GetAppenders())
        {
            if (appender.Name.Equals("TemplatableRollingFileAppender"))
            {
                FileAppender fileAppender = appender as FileAppender;
                if ( fileAppender != null )
                {
                    string file = fileAppender.File;
                    if (!string.IsNullOrEmpty(file))
                    {
                        if (file.Contains("MyApp"))
                        {
                            fileAppender.File = file.Replace("MyApp", entryAsm.GetName().Name);
                            fileAppender.ActivateOptions();                            
                            /*変更前のファイルを消してしまって良いならばコメントをはずす*/
                            /*
                            if (File.Exists(file))
                            {
                                File.Delete(file);
                            }
                            */
                        }
                    }
                }
            }
        }
    }
}

変更できるパラメタは"File"だけではないので、これを応用していろいろできそうだ。