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 的环境变量。

提前致谢,

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 回答