将外部log4net配置文件与环境变量一起使用

时间:2015-12-30 17:43:42

标签: c# .net log4net

我正在尝试将我的应用程序的所有配置和日志文件分组到一个基本文件夹(C:\ MY_PRODUCT \)中,以具有以下结构:

C:\MY_PRODUCT\CONFIGURATION\
C:\MY_PRODUCT\LOGS\
...

我正在使用 log4net 进行日志记录,并且使用log4net中的环境变量FileAppender配置正常工作:

<appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
<file value="${PRODUCT_BASE}\LOGS\file.log" />
<threshold value="ALL" />
<appendToFile value="true" />
<maximumFileSize value="10MB" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="200" />
<layout type="log4net.Layout.PatternLayout">
  <conversionPattern value="[%date{O}] [%-5level] [%-3thread] [%logger] [%method] %message%newline" />
</layout>

但是,通过分离新文件(C:\ MY_PRODUCT \ CONFIGURATION \ Log4Net.config)中的log4net配置,通过设置属性 ConfigSource

<log4net configSource="${PRODUCT_BASE}\CONFIGURATION\Log4Net.config" />

请注意if if我的值(路径C:\ MY_PRODUCT)替换$ {PRODUCT_BASE}环境变量,它正常工作,log4net能够找到配置文件。

Log4Net日志:

我启用了log4net调试模式,看看发生了什么,我收到了以下错误:

log4net:ERROR无法解析配置文件。是指定为: System.Configuration.ConfigurationErrorsException:无法打开configSource文件'$ {PRODUCT_BASE} \ config \ Log4Net.config'。 (Tests \ bin \ Debug \ MY_PRODUCT.Core.Tests.dll.config第10行)    at System.Configuration.BaseConfigurationRecord.EvaluateOne(String [] keys,SectionInput input,Boolean isTrusted,FactoryRecord factoryRecord,SectionRecord sectionRecord,Object parentResult)    at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord,SectionRecord sectionRecord,Object parentResult,Boolean getLkg,Boolean getRuntimeObject,Object&amp; result,Object&amp; resultRuntimeObject)    at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey,Boolean getLkg,Boolean checkPermission,Boolean getRuntimeObject,Boolean requestIsHere,Object&amp; result,Object&amp; resultRuntimeObject)    at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey,Boolean getLkg,Boolean checkPermission,Boolean getRuntimeObject,Boolean requestIsHere,Object&amp; result,Object&amp; resultRuntimeObject)    at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey,Boolean getLkg,Boolean checkPermission,Boolean getRuntimeObject,Boolean requestIsHere,Object&amp; result,Object&amp; resultRuntimeObject)    在System.Configuration.BaseConfigurationRecord.GetSection(String configKey)    在System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName)    在System.Configuration.ConfigurationManager.GetSection(String sectionName)    at log4net.Config.XmlConfigurator.InternalConfigure(ILoggerRepository repository)

我不知道Log4Net是否正在扩展属性ConfigSource的环境变量,我已经在Apache Log4Net问题平台上发布了这个问题,直到他们回答或解决问题,有没有办法实现这种方法?

1 个答案:

答案 0 :(得分:0)

谷歌搜索后,似乎它不是Log4Net问题,正如他们在msdn post上所说的那样:

  

不,这不可能是原生的。

我最后在app.config中添加了一个新的应用程序设置:

<add key="log4net.config" value="%PRODUCT_BASE%\config\Log4Net.config"/>

在启动时配置log4net:

string log4NetConfigFile = ConfigurationManager.AppSettings["log4net.config"];
        var fileInfo = new FileInfo(Environment.ExpandEnvironmentVariables(log4NetConfigFile));
        XmlConfigurator.Configure(fileInfo);

我希望这会帮助其他人遇到同样的问题。