Был размещен сервис WCF и log4net - PullRequest
2 голосов
/ 13 сентября 2010

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

Вот как устроена моя серверная сторона:

  • DLL WCF, которая содержит контракт моей службы и базовую реализацию (включая обработку ошибок). Фактические операции выполняются на отдельном бизнес-уровне, который генерирует необходимые исключения, которые перехватываются реализацией (и отправляются обратно с использованием FaultContracts).
  • Уровень данных (здесь нет проблем).
  • Библиотека "Utils", которая содержит мои методы журнала оболочки.

Мой файл log4net.config имеет следующий вид:

<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="false">

  <appender name="TechnicalFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
    <param name="File" value="c:\\log\\technical.log"/>
    <param name="AppendToFile" value="true"/>
    <param name="RollingStyle" value="Date"/>
    <param name="DatePattern" value="'_'yyyyMMdd-HH"/>
    <layout type="log4net.Layout.PatternLayout,log4net">
      <param name="ConversionPattern" value="%d [%-5t] %-5p - %m%n"/>
    </layout>
  </appender>

  <root>
    <level value="ALL"/>
  </root>

  <logger name="TechnicalLog">
    <level value="ALL"/>
    <appender-ref ref="TechnicalFileAppender"/>
  </logger>

</log4net>

Таким образом, когда ошибка возникает на бизнес-уровне, она фиксируется, регистрируется и преобразуется в FaultException. Есть проблема. Файл журнала не создан. Я гуглил и нашел некоторые подсказки (права доступа вообще, но я использовал ProcMon и не нашел обращения к нужному файлу или каталогу).

Я немного растерялся, не знаю, что попробовать.

Я публикую свой сервис с помощью команды «publish» в Visual Studio, поэтому на сервере у меня есть каталог приложений, внутри есть файл svc, файл web.config, а затем каталог bin со всеми моими DLL, включая log4net.dll и log4net.config. Я попытался скопировать этот файл конфигурации в корень моего приложения, но безуспешно.

Я также пытался разместить [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] оператор в файле AssemblyInfo.cs моего WCF (изначально он был в файле AssemblyInfo.cs для Utils), но безуспешно.

Спасибо за помощь, любая идея приветствуется!

1 Ответ

1 голос
/ 13 сентября 2010

Я почти уверен, что log4net не находит файл конфигурации.

У меня была та же проблема, и я думаю, что решил ее, установив настройку приложения в файле web.config, который содержит полный путь к файлу конфигурации log4net. В своей оболочке я убедился, что log4net настроен, вызвав метод ConfigureAndWatch, если log4net еще не настроен.

В качестве альтернативы вы можете просто скопировать конфигурацию log4net в файл web.config (но я бы этого не сделал, потому что вы теряете возможность изменять настройки журнала для работающей системы). В этом случае вам нужно добавить это к вам AssemblyInfo.cs (или другой файл, если вы предпочитаете):

[assembly: log4net.Config.XmlConfigurator()]

Если это не помогло, я рекомендую включить внутреннюю отладку .

...