Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 企业日志记录不转换XML跟踪侦听器文件名规范中的环境变量_C#_Enterprise Library_Error Logging_Enterprise Library 5 - Fatal编程技术网

C# 企业日志记录不转换XML跟踪侦听器文件名规范中的环境变量

C# 企业日志记录不转换XML跟踪侦听器文件名规范中的环境变量,c#,enterprise-library,error-logging,enterprise-library-5,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="

我正在使用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);
logWriter=Microsoft.Practices.EnterpriseLibrary.Common.Configuration.EnterpriseLibraryContainer.Current.GetInstance();
logWriter.Write(logEntry);
我将得到一个DirectoryNotFoundException,文本为:找不到路径
'D:\Project\Application\bin\x86\Debug\%ALLUSERSPROFILE%\CompanyName\AppName\Diagnostics\ErrorLog.xml的一部分。

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

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

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


感谢您的建议。

我希望在今天早上回去工作之前,能看到有人回答这个问题。看到没有答案,我想我会在这个问题上多花几分钟,因为我只有一个难闻的解决办法

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

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

希望这能为其他人节省几个小时的时间。

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

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