【问题标题】:Accessing appSettings config values from log4net config section从 log4net 配置部分访问 appSettings 配置值
【发布时间】:2013-03-26 16:38:25
【问题描述】:

有谁知道是否可以从同一文件中的 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 的环境变量.

提前致谢,

罗伯

【问题讨论】:

    标签: log4net


    【解决方案1】:

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

    希望这仍然有帮助:)

    【讨论】:

      【解决方案2】:

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

      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>
      

      在配置中,我是说从表单的 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>
      

      你说你想在不编写代码的情况下做到这一点。我不确定它是否可以完成,但使用我上面展示的方法非常常见且非常简单。

      【讨论】:

      • 最初的请求是将可变数据插入到文件规范中。模式布局转换器是否会在“ConversionPattern”之外工作。例如,它可以在 File log4net 属性中工作吗?
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-08-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-19
        • 2013-06-28
        • 2013-07-02
        • 2015-01-14
        • 1970-01-01
        • 2019-03-28
        相关资源
        最近更新 更多