Enterprise Logging不在XML跟踪侦听器fileName规范中转换环境变量

时间:2012-02-01 17:05:03

标签: c# enterprise-library error-logging enterprise-library-5

我正在使用Microsoft Enterprise Library 5.0可选更新1进行日志记录。我的app.config文件中有一个声明的部分,如下所示:

  <loggingConfiguration name="LLamasoftLoggingConfiguration" tracingEnabled="true"       defaultCategory="General">
        <listeners>
          <add name="XML Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.XmlTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
              listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.XmlTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
              fileName="%ALLUSERSPROFILE%\CompanyName\AppName\Diagnostics\ErrorLog.xml" traceOutputOptions="None" />
        </listeners>
    ...
  </loggingConfiguration>

当我运行应用程序并开始使用日志记录时,例如,

  logWriter = Microsoft.Practices.EnterpriseLibrary.Common.Configuration.EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
  logWriter.Write(logEntry);

我将获得带有文本的DirectoryNotFoundException:找不到路径的一部分'D:\Project\Application\bin\x86\Debug\%ALLUSERSPROFILE%\CompanyName\AppName\Diagnostics\ErrorLog.xml'.

当我使用像'C:\ProgramData\CompanyName\AppName\Diagnostics\ErrorLog.xml'这样的绝对路径时,它会起作用。

我看到许多引用说我应该能够在日志文件路径中使用环境变量,但无论我尝试哪种,它们都会附加到当前的执行目录路径。参考文献还说日志系统会创建文件夹,如果它不存在但我必须确保它存在。

这是我第一次使用企业日志记录应用程序块,所以我不知道版本之间的行为是否发生了变化,如果这个行为有这些怪癖。现在,我已经将路径硬编码到我的app.config文件中,但对于最终版本,这应该是动态确定的。

建议表示赞赏。

2 个答案:

答案 0 :(得分:2)

我希望在今天早上回到工作岗位之前看到有人回答了这个问题。看不到答案,我想我会花更多的时间来解决这个问题,因为我只有一个有臭味的解决方法。

我安装了库提供的源代码(谢谢你,微软),构建了解决方案并检查了代码。简而言之,环境变量的扩展只会在提供给FlatFileTraceListener的文件名中发生。虽然期望XmlTraceListener的基于文件的用法会做同样的事情似乎是合理的,但事实并非如此。如果没有扩展环境变量,您将看到我上面描述的行为。

如果要更改行为,请查看Logging.2010项目并检查TraceListeners文件夹中的FlatFileTraceListener.cs和XmlTraceListener.cs代码。您将看到对帮助程序EnvironmentHelper.ReplaceEnvironmentVariables(string fileName)的调用,它与平面文件实现一起使用,而不是与xml(文件)实现一起使用。这看起来很容易改变。

希望能在几个小时的时间内拯救别人。

答案 1 :(得分:-1)

“在文件名中使用时不会扩展环境变量”的问题可以通过将最新的 entlib 版本5.0添加到您的解决方案中来解决。我通过以下方式下载了它:

  1. 右键单击您的解决方案(VS 2013)。
  2. 管理NuGET包。
  3. 搜索entlibcontrib 5.0日志记录扩展块。
  4. 将其添加到您的所有项目中。
  5. 然后日志记录类能够解析文件名中的%USERPPROFILE%字符串,并且我能够在 userprofile 文件夹中看到我的日志文件。