Enterprise Logging не переводит переменные среды в спецификацию имени файла прослушивателя трассировки XML

Я использую необязательное обновление 1 Microsoft Enterprise Library 5.0 для ведения журнала. У меня есть объявленный раздел в моем файле 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, но в окончательной версии он должен определяться динамически.

Предложения приветствуются.


person Scott Howard    schedule 01.02.2012    source источник


Ответы (2)


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

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

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

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

person Scott Howard    schedule 02.02.2012

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

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

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

person sneha    schedule 12.10.2015