Ведение журнала предприятия не транслирует переменные среды в спецификации имя файла XML Trace Listener - PullRequest
2 голосов
/ 01 февраля 2012

Я использую 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);

Iя получу исключение DirectoryNotFoundException с текстом: не удалось найти часть пути 'D:\Project\Application\bin\x86\Debug\%ALLUSERSPROFILE%\CompanyName\AppName\Diagnostics\ErrorLog.xml'.

Когда я использую абсолютный путь, такой как 'C:\ProgramData\CompanyName\AppName\Diagnostics\ErrorLog.xml', он работает.

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

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

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

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

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

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

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

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

0 голосов
/ 12 октября 2015

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...