2013-05-27 4 views
15

Я понимаю, что thisquestionhasbeenaskedseveraltimes, но, к сожалению, я не был в состоянии получить мою конфигурацию протоколирование работать. Я должен совершать какую-то очень маленькую ошибку.log4net работает только тогда, когда XmlConfigurator.Configure() называется

У меня есть веб-приложение .NET 4.5 MVC 4/EF 5, и я пытаюсь заставить журнал работать. Решение имеет два проекта: один для объектов DAO и модели, а другой для веб-сайта. App.Config файл выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false" /> 
    </configSections> 
    <connectionStrings> 
    <add name="RebuildingTogetherEntities" connectionString="stuff..."/> 
    </connectionStrings> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    </entityFramework> 
    <log4net configSource="Log.config" /> 
</configuration> 

То же log4net раздел также был скопирован в файл Web.config.

Я добавил следующее обоих AssemblyInfo.cs файлов:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log.config", Watch = true)] 

«Копировать в выходной каталог» установлен в положение верно для обоих файлов Log.Config.

Единственный способ, с помощью которого я могу получить регистрацию для добавления к выходному файлу, - это вызвать XmlConfigurator.Configure() перед запуском первого оператора ведения журнала. Наверное, я могу написать фасад, чтобы сделать это, когда я впервые получаю регистратор, но это просто неправильно.

Как инициализировать регистратор без вызова XmlConfigurator вручную?

+0

делает HTTP: // stackoverflow.com/questions/3971250/log4net-configuration-from-assembly-attribute-does-not-load-configuration-file применяются? – sgmoore

+0

Казалось бы, нет ... в этом случае было сообщение от log4net до выключения приложения, но я не вижу этого сообщения в моем случае. Спасибо за предложение. – Brad

+0

Не уверен, что я согласен с вашей логикой. Вы не увидите сообщение log4net, если включено внутреннее ведение журнала, и если ваша система не читает ваш файл log.config, то он, вероятно, не будет включен. Важно то, что когда вы делаете что-то вроде GetLogger (...), система будет в основном делать что-то эквивалентное Attribute.GetCustomAttributes (Assembly.GetCallingAssembly(), typeof (log4net.Config.ConfiguratorAttribute), false). Следовательно, если вы не заходите в систему в начале запуска приложения, ваш первый регистратор может быть инициализирован из сборки, которая не будет продолжать настраиваемый атрибут. – sgmoore

ответ

6

Вам не нужно вызывать XmlConfigurator вручную, если вы используете:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log.config", Watch = true)] 

Однако вы должны добавить тег для всех ваших библиотек DLL (все assambly.cs файлы).

+1

Приложение по-прежнему не регистрируется, даже если оно добавлено, к сожалению. – Brad

+2

Вы можете включить отладку log4net: http://haacked.com/archive/2006/09/27/Log4Net_Troubleshooting.aspx – Peter

+0

Не могли бы вы объяснить, почему вы рекомендовали добавить этот атрибут в * all * dll, а не только из хоста? – DarkWalker

16

Я столкнулся с такой же проблемой. Как вы правильно отметили, вам не нужно явно указывать XmlConfigurator, когда вы включаете строку в свой AssemblyInfo.cs. Проблема возникает, когда первое использование log4net происходит в assebmly, у которого нет этой строки. В моем случае я использовал пакет Topshelf.Log4Net NuGet и первую строку журнала, через которую было зарегистрировано мое приложение.

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

LogManager.GetLogger(typeof(Program)); 
+0

Отличный ответ. У нас была та же проблема, когда объект, который был автоматически создан нашим контейнером DI, выплескивал линию регистрации до основного приложения. – BBoy

+0

Какая жизнь. Поместите его в global.asax.cs, и он отлично работает. Провел буквально день за это. – arviman

+0

Что такое программа в этом случае? – Euridice01