11

ロギングにlog4netを使用している内部アプリがあります。でログを生成したいのですが%LOCALAPPDATA%\Vendor\App\application.log。残念ながら、log4netは%APPDATA%代わりにログファイルを作成しています。ここでプロファイルされたローミングは実際には使用しないため、これは大きな問題ではありませんが、回避できる場合は、コードに小さな特異性を残すのは好きではありません。

log4netをプログラムで構成せず、pinvokeを使用してXPのパスを取得せずに、指定した場所にファイルを書き込む方法について何か考えはありますか?

それが助けになるなら、これが私の設定ファイルのアペンダーセクションです:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="${LOCALAPPDATA}\Vendor\App\application.log" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="100KB" />
  <staticLogFileName value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger%newline%message%newline" />
  </layout>
</appender>
4

3 に答える 3

17

ここでのパーティーには非常に遅れましたが、私はこれに出くわし、答えを見つけました。

log4net.Util.PatternStringを使用して、環境変数をファイルパスに挿入できるようです。したがって、OPの例は次のようになります。

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="%env{LOCALAPPDATA}\Vendor\App\application.log" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="100KB" />
  <staticLogFileName value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger%newline%message%newline" />
  </layout>
</appender>

type = "log4net.Util.PatternString"をファイル要素に追加してから、 %envパターン指定子の後に、中括弧で囲まれた環境変数名を指定します。

于 2019-04-05T16:30:43.693 に答える
10

これが機能しない場合は、環境変数が間違っていることを意味します。

Log4netには、appdataまたはlocalappdataを処理するための特別な機能はありません。ハッシュテーブルを返すために呼び出すだけSystem.Environment.GetEnvironmentVariables()で、返される値に基づいて置換を実行します。

于 2013-02-27T13:25:13.743 に答える
0

そして、誰にとっても、それは私と同じ問題を抱えていました:

  • さまざまなケースを使用している場合でも、これは機能しません:(LocalAppData、LOCALAPPDATA、localappdataなど)
  • 設定はlog4net.configファイルではなくコードで行われるため、「util.PatternString」は使用できません

これにより、ローカルアプリデータまたは必要な環境変数パスを取得できます。「localappdata」などの小文字を使用してください。見つからなかった場合はempty.stringを返します。

private static string GetLocalAppDataPath()
{
    foreach (DictionaryEntry environmentVariable in Environment.GetEnvironmentVariables())
    {
        var environmentVariableString = environmentVariable.Key as string;
        if (environmentVariableString?.ToLower() == "localappdata")
            return (string) environmentVariable.Value;
    }

    return string.Empty;
}
于 2020-01-12T14:50:14.907 に答える