【问题标题】:Enterprise Logging not translating environment variables in XML Trace Listener fileName specification企业日志记录未在 XML 跟踪侦听器文件名规范中转换环境变量
【发布时间】:2012-02-24 09:06:17
【问题描述】:

我正在使用 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 文件中,但对于最终版本,这应该是动态确定的。

建议表示赞赏。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-02
        • 1970-01-01
        • 1970-01-01
        • 2011-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多