web-dev-qa-db-ja.com

log4net:ロガーファイル名を動的に設定する方法

これは本当によくある質問ですが、私は仕事に対する答えを得ることができませんでした。これが私の設定ファイルです:

<?xml version="1.0" encoding="utf-8"?>
<log4net>
  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="CraneUserInterface.log" />
    <appendToFile value="true" />
    <maxSizeRollBackups value="90" />
    <rollingStyle value="Size" />

    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date - %message%newline" />
    </layout>
  </appender>

  <root>
    <level value="DEBUG" />
    <appender-ref ref="RollingFile" />
  </root>

しかし、実行時に実際のログファイル名を特定する必要があります。素敵な例 here を見つけましたが、GetIterators()の呼び出しによって返されたコレクションをループしようとしたときに、そのコレクションが空であることがわかりました。

プログラムが実行時に読み取るものに応じて、「CraneUserInterface.log」という名前を「CraneUserInterface_1.log」、または2または3に変更する必要があります。どうやってやるの?

これは、そのサンプルで提示されたコードを使用する最初のパスです。

static bool ChangeLogFileName(string AppenderName, string NewFilename)
{           
   // log4net.Repository.ILoggerRepository RootRep;
   // RootRep = log4net.LogManager.GetRepository();
   log4net.Repository.ILoggerRepository RootRep = m_logger.Logger.Repository;
   foreach (log4net.Appender.IAppender iApp in RootRep.GetAppenders())
   {
   string appenderName = iApp.Name;
   if (iApp.Name.CompareTo(AppenderName) == 0
       && iApp is log4net.Appender.FileAppender)
   {
       log4net.Appender.FileAppender fApp = (log4net.Appender.FileAppender)iApp;
       fApp.File = NewFilename;
       fApp.ActivateOptions();
       return true; // Appender found and name changed to NewFilename
   }
}
return false; // appender not found
}

どうもありがとう!

15

「%property」を使用してファイル名に動的な「タグ」を定義するにはどうすればよいですか(実行時)?

<file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" />

ここで説明: アペンダーファイルパスを動的に設定する最良の方法

8
Luciano

この関数を使用できます。この関数では、最初にwebconfigで設定したファイルの場所を取得し、その後、必要なパスを追加できます。デートみたい!お客様!または.....

WebConfig:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="C:\\t4\\"/>
    <appendToFile value="true"/>
    <rollingStyle value="Composite"/>
    <datePattern value="_yyyy-MM-dd.lo'g'"/>
    <maxSizeRollBackups value="10"/>
    <maximumFileSize value="1MB"/>
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date User:%identity IP:%X{addr} Browser: %X{browser} Url: %X{url} [%thread] %-5level %c:%m%n"/>
    </layout>
</appender>

関数:

public static void ChangeFileLocation(string _CustomerName,string _Project)
{
    XmlConfigurator.Configure();
    log4net.Repository.Hierarchy.Hierarchy h =(log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();

    foreach (IAppender a in h.Root.Appenders)
    {
        if (a is FileAppender)
        {
            FileAppender fa = (FileAppender)a;
            string sNowDate=  DateTime.Now.ToLongDateString();
            // Programmatically set this to the desired location here
            string FileLocationinWebConfig = fa.File;
            string logFileLocation = FileLocationinWebConfig + _Project + "\\" + _CustomerName + "\\" + sNowDate + ".log";

            fa.File = logFileLocation;
            fa.ActivateOptions();
            break;
        }
    }
}

結果は次のようになります:C:\ t4\TestProject\Customer1\Saturday、August 31、2013.log

5
Faez Mehrabani