从log4net配置部分访问appSettings配置值

时间:2013-03-26 16:38:25

标签: log4net

是否有人知道是否可以从同一文件中的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的Environment变量一起放入

提前致谢,

罗布

3 个答案:

答案 0 :(得分:4)

您应该使用 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>

希望这仍然有帮助:)

答案 1 :(得分:2)

感谢@wageoghe的帮助。最后,我决定再次将环境值添加到配置文件中(为简单起见):

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

答案 2 :(得分:1)

如果你看看我对这个问题的回答:

Custom log4net property PatternLayoutConverter (with index)

您将找到自定义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>

在配置中,我想从Form的AppSettings中获取“KLPC”设置。

在您的情况下,您希望从配置文件的appSettings中获取值。修改我提供的示例应该很容易,用Form代替从Form的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>

你说你想在不编写代码的情况下这样做。我不确定它是否可以完成,但使用我上面显示的方法非常常见且很容易。