Log4netが(RollingFileAppenderを使用して)ログファイルを一般的なアプリケーションデータフォルダーのサブフォルダー(C:\ Documents and Settings\All Users\Application Data\Company\Product\Logsなど)に書き込んでほしい。
ただし、Win XPでは、このフォルダを指定する環境変数はありません。 %ALLUSERSPROFILE%
、%APPDATA%
がありますが、%ALLUSERSAPPDATA%
のようなものはありません。
プログラム的には、Environment.SpecialFolder.CommonApplicationData
を使用することもできますが、次のように、log4net構成に配置する必要があります。
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="%ALLUSERSAPPDATA%\Company\Product\Logs\error.log" />
</appender>
OK、これをセットアップで定義することもできますが、誰かがより良いアイデアを思い付くでしょうか?
この投稿 log4netメーリングリストの=は、独自のパス置換変数を定義する方法を説明しています。
私たちはこれを使うだけです:
<param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/>
それは素晴らしい働きをします。
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/>
</appender>
pilif がリンクしているlog4netメーリングリストの完全なコードは次のとおりです。
基本的には、log4net設定ファイル用のカスタムパターンコンバーターを実装する方法です。
まず、このクラスをプロジェクトに追加します。
public class SpecialFolderPatternConverter : log4net.Util.PatternConverter
{
override protected void Convert(System.IO.TextWriter writer, object state)
{
Environment.SpecialFolder specialFolder = (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), base.Option, true);
writer.Write(Environment.GetFolderPath(specialFolder));
}
}
次に、FileAppenderのFileパラメータを次のように設定します。
<file type="log4net.Util.PatternString">
<converter>
<name value="folder" />
<type value="MyAppName.SpecialFolderPatternConverter,MyAppName" />
</converter>
<conversionPattern value="%folder{CommonApplicationData}\\SomeOtherFolder\\log.txt" />
</file>
基本的に%folder
は、SpecialFolderPatternConverterクラスを指すfolder
というコンバーターを確認するように指示します。次に、そのクラスでConvert
を呼び出し、CommonApplicationData(またはその他の)列挙値を渡します。
どうやら、log4netの次のリリース(1.2.11)では、 here で説明されているように、より簡単な方法があるでしょう。
完全で機能するソリューション-Log4net.configファイルの内容。 Log4Netの実際のバージョンでは、独自のパターンコンバーターを作成する必要はありません。
<?xml version="1.0"?>
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="LogFileAppender" />
</root>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
<file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\MyProject\\Logs\\log.txt" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100MB" />
<layout type="log4net.Layout.PatternLayout">
<ConversionPattern type="log4net.Util.PatternString" value="%%-5p %%d{yyyy-MM-dd HH:mm:ss} - %%m%%n" />
</layout>
</appender>
</log4net>
現在のlog4netバージョン(2.0.8.0)では、簡単に使用できます
<file value="${ProgramData}\myFolder\LogFiles\" />
ために C:\ProgramData
${LocalAppData}
ために C:\Users\user\AppData\Local\
および${AppData}
ために C:\Users\user\AppData\Roaming\
現在(2018年2月に)log4netバージョン2.0.8.0に従って。
次のように、コンバーターなしで使用して、環境変数を取得できます。
<file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\mylogfile.txt" />
詳細は log4net.Util.PatternString クラスのドキュメントを参照してください。