2

Я использую Microsoft Enterprise Library 5.0 Дополнительное обновление 1 для ведения журнала. У меня есть заявленный раздел в моем файле app.config следующим образом:Enterprise Logging не перевод переменных среды в XML Trace Listener fileName спецификация

<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', он работает.

Я вижу несколько ссылок, говорящих, что я должен использовать окружения vars в пути к файлу журнала, но независимо от того, что я пытаюсь, они добавляются к текущему пути каталога выполнения. В ссылках также говорится, что система регистрации создаст папку, если она не существует, но я должен убедиться, что она существует.

Это мое первое использование блока приложений Enterprise Logging, поэтому я не знаю, изменилось ли поведение между версиями, и если у этого есть только эти причуды. На данный момент я жестко закодировал путь в файле app.config, но для окончательной версии это должно быть динамически определено.

Предложения оценены.

ответ

2

Я надеялся, что кто-то ответил на вопрос, прежде чем я вернусь к работе этим утром. Не видя ответа, я подумал, что потрачу всего пару минут на проблему, так как у меня было только вонючее обходное решение.

Я установил исходный код, поставляемый с библиотекой (спасибо, Microsoft), построил решение и изучил код. Короткий ответ: расширение переменных среды будет происходить только с именами файлов, предоставляемыми FlatFileTraceListener. Хотя представляется разумным ожидать, что использование XmlTraceListener на основе файлов сделает то же самое, но это не так. Без расширения переменных среды вы увидите поведение, описанное выше.

Если вы хотите изменить поведение, загляните в проект Logging.2010 и изучите код FlatFileTraceListener.cs и XmlTraceListener.cs в папке TraceListeners. Вы увидите вызов помощнику, EnvironmentHelper.ReplaceEnvironmentVariables(string fileName), используемый с реализацией плоского файла, а не с реализацией xml (файла). Похоже, это легкое изменение.

Надеюсь, что это поможет кому-то еще несколько часов.

-1

Проблема «переменных среды не расширяется при использовании в именах файлов» может быть решена путем добавления к вашему решению последней версии entlib версии 5.0. Я загрузил его:

  1. Щелкните правой кнопкой мыши по вашему решению (VS 2013).
  2. Управление пакетами NuGET.
  3. Поиск блока расширения журнала entlibcontrib 5.0.
  4. Добавьте его ко всем вашим проектам.

Тогда класс протоколирования смог разобрать %USERPPROFILE% строку в имени файла, и я был в состоянии видеть, что мой файл журнала создается в Userprofile папку.

Смежные вопросы