web-dev-qa-db-ja.com

log4netの共通アプリケーションデータフォルダーを指定する方法

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、これをセットアップで定義することもできますが、誰かがより良いアイデアを思い付くでしょうか?

35
user57474

この投稿 log4netメーリングリストの=は、独自のパス置換変数を定義する方法を説明しています。

12
pilif

私たちはこれを使うだけです:

<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>
33
pduncan

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 で説明されているように、より簡単な方法があるでしょう。

12
codeulike

完全で機能するソリューション-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>
3
user2126375

現在のlog4netバージョン(2.0.8.0)では、簡単に使用できます

<file value="${ProgramData}\myFolder\LogFiles\" /> ために C:\ProgramData

${LocalAppData} ために C:\Users\user\AppData\Local\

および${AppData} ために C:\Users\user\AppData\Roaming\

2
Apfelkuacha

現在(2018年2月に)log4netバージョン2.0.8.0に従って。

次のように、コンバーターなしで使用して、環境変数を取得できます。

<file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\mylogfile.txt" />

詳細は log4net.Util.PatternString クラスのドキュメントを参照してください。

0
Mohamed Navas