我有一个名为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" />
. . . . .
答案 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;