2

我正在使用 Microsoft Enterprise Library 5.0 Optional Update 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'它会起作用。

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

这是我第一次使用 Enterprise Logging 应用程序块,所以我不知道版本之间的行为是否发生了变化,以及这个是否只是有这些怪癖。目前,我已将路径硬编码到我的 app.config 文件中,但对于最终版本,这应该是动态确定的。

建议表示赞赏。

4

2 回答 2

2

我希望看到有人在我今天早上重新开始工作之前回答了这个问题。看到没有答案,我想我会在这个问题上多花几分钟,因为我只有一个臭名昭著的解决方法。

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

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

希望这可以节省其他人几个小时的时间。

于 2012-02-02T16:07:51.347 回答
-1

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

  1. 右键单击您的解决方案(VS 2013)。
  2. 管理 NuGET 包。
  3. 搜索 entlibcontrib 5.0 日志记录扩展块。
  4. 将其添加到您的所有项目中。

然后日志记录类能够解析%USERPPROFILE%文件名中的字符串,并且我能够看到我的日志文件是在userprofile文件夹中创建的。

于 2015-10-12T07:16:45.633 回答