如何在链接的配置文件中提取和解析值

时间:2014-06-23 12:01:59

标签: c#

我有一个名为log.config的文件,该文件在App.config的appSettings部分中引用。

在log.config中我有一行(参见下面这行适合log.config的地方)...

<file type="log4net.Util.PatternString" value="${ALLUSERSPROFILE}/dir1/Log/log.txt" />

我想检索log.txt的完整路径名。即提取值并解析变量。即得到字符串:

C:\ProgramData\dir1\Log\log.txt
这可能吗? (我试图摆弄System.Configuration.ConfigurationManager,但无法弄清楚如何获得它。)

... log.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net"
       type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>

    <appender name="HourlyAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="${ALLUSERSPROFILE}/dir1/Log/log.txt" />
      <appendToFile value="false" />
      . . . . .

1 个答案:

答案 0 :(得分:2)

log4net解析变量的方式是使用OptionConverter.SubstituteVariables,如果是环境变量,它只使用Environment.GetEnvironmentVariables()来获取所有变量的字典。

所以你可以使用:

log4net.Util.OptionConverter.SubstituteVariables("${ALLUSERSPROFILE}/dir1/Log/log.txt", Environment.GetEnvironmentVariables())

,结果为C:\ProgramData/dir1/Log/log.txt

另一个选择是使用正则表达式自己解析环境变量以及Environment.ExpandEnvironmentVariables来扩展环境变量:

Regex.Replace("${ALLUSERSPROFILE}/dir1/Log/log.txt",
              @"\$\{(.*)\}",
              m => Environment.ExpandEnvironmentVariables(String.Format("%{0}%", m.Groups[1])))

要阅读配置文件的这一部分,通常会创建一个合适的IConfigurationSectionHandler

log4net确实提供了一个(Log4NetConfigurationSectionHandler),但在这里对你没用。但由于配置是XML,我们可以使用SelectSingleNode方法:

XmlElement config = (XmlElement)ConfigurationManager.GetSection("log4net");
string path = config.SelectSingleNode("appender/file").Attributes["value"].Value;