6

同じファイルのlog4net構成セクションから(コードを使用せずに)構成ファイルのappSettingsセクションからキー/値にアクセスできるかどうか誰かが知っていますか?

例えば:

<appSettings>
    <add key="Environment" value="DEV" />
    <!-- etc -->
</appSettings>
<log4net>
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="${APPDATA}\MyApp\${Environment}\MyApp.log" />
    <!-- etc -->
</log4net>

これに関するドキュメントはないようですので、期待はしていません...他のすべてが失敗した場合は、ファイル値に「DEV」を追加し、appSettingsの環境変数と一緒にsubstします。

前もって感謝します、

ロブ

4

3 に答える 3

6

ファイルタイプとしてlog4net.Util.PatternStringを使用し、 %appSetting{SETTING}を使用してアプリ設定を参照する必要があります。

以下のコードを参照してください。

<appSettings>
    <add key="Environment" value="DEV" />
    <!-- etc -->
</appSettings>
<log4net>
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString"
        value="${APPDATA}\MyApp\%appSetting{Environment}\MyApp.log"/>
    <!-- etc -->
</log4net>

これがまだ役立つことを願っています:)

于 2017-12-04T09:23:55.317 に答える
2

この質問に対する私の答えを見ると:

カスタムlog4netプロパティPatternLayoutConverter(インデックス付き)

カスタムPatterLayoutConverterの例があります。この例の場合、私はそれをKeyLookupPatternConverterと呼びました。

便宜上、ここにあります:

namespace Log4NetTest
{
  class KeyLookupPatternConverter : PatternLayoutConverter
  {
    protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent)
    {
      //Use the value in Option as a key into the "application settings" stored on the main form.
      string setting;
      if (Form1.AppSettings.TryGetValue(Option, out setting))
      {
        writer.Write(setting);
      }
    }
  }
}

そして、これがあなたがそれを構成する方法です:

  //Log the "sessionid" and "userid" values from our "application settings" object
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%d [%t] %-5p [session = %KLPC{sessionid}] [user = %KLPC{userid}] %m%n"/>
    <converter>
      <name value="KLPC" />
      <type value="Log4NetTest.KeyLookupPatternConverter" />
    </converter>
  </layout>

構成では、フォームのAppSettingsから「KLPC」設定を取得すると言っています。

あなたの場合、設定ファイルのappSettingsから値を取得したいとします。フォームのAppSettingsから設定を取得するコードを、構成ファイルのアプリ設定から設定を取得するコードに置き換えて、提供した例を変更するのは簡単なはずです。

このルートを使用する場合、AppSettingPatternConverterは次のようになります(テストされていません)。

  class AppSettingsPatternConverter : PatternLayoutConverter
  {
    protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent)
    {
      //Use the value in Option as a key into the "application settings" stored on the main form.
      string setting = ConfigurationManager.AppSettings[Option];
      if (string.IsNullOrWhitespace(setting))
      {
        setting = string.Format("No setting value for key[{0}]", Option);
      }

      writer.Write(setting);
    }
  }

次のように構成します。

  //Log the "Name" setting from the application settings object
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%d [%t] %-5p [name = %AppSetting{Name}] %m%n"/>
    <converter>
      <name value="AppSetting" />
      <type value="Log4NetTest.AppSettingPatternConverter" />
    </converter>
  </layout>

あなたはコードを書かずにそれをやりたいと言います。それができるかどうかはわかりませんが、上に示したアプローチを使用することは非常に一般的で非常に簡単です。

于 2013-03-27T21:19:42.403 に答える
2

助けてくれてありがとう@wageoghe。最後に、環境値を構成ファイルに再度追加することにしました(簡単にするため)。

<log4net>
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="${APPDATA}\MyApp\DEV\MyApp.log" />
    <!-- etc -->
</log4net>
于 2013-05-09T13:02:36.233 に答える