2012-06-13 5 views
4

Я помню дни (не так давно, действительно), когда log4net пришел вместе с NH и был обязательным для OR-Mapper. В настоящее время это не обязательно, но необязательно.Как NHibernate реализует необязательный журнал log4net

Мне действительно интересно, как это достигается NHibernate. Если бы кто-нибудь мог объяснить в нескольких словах, это было бы высоко оценено!

+0

Как это достигается? Довольно уверен, что вам все еще нужен Log4Net, вам просто не нужно его регистрировать. –

+0

Да, но именно то, что вы называете «не нужно», - это то, что я хочу понять. Если я скомпилирую проект с log4net и просто удалю dll позже, я не получу необязательный журнал, но сломанную часть программного обеспечения ... –

+0

... следовательно, «вам все равно нужен Log4Net». Вы можете уменьшить количество журналов nhibernate в Log4Net, установив уровень в «FATAL» или некоторые из них в конфигурационном файле, но «log4net.dll» является зависимостью от NHibernate. –

ответ

9

NHibernate имеет ILoggerFactory создать регистратор, определенный, как показано ниже:

public interface ILoggerFactory 
    { 
     IInternalLogger LoggerFor(string keyName); 
     IInternalLogger LoggerFor(System.Type type); 
    } 

Интерфейс IInternalLogger, что depites имя не является внутренним вообще, фактический интерфейс регистратора, что не удивительно карту точно ILog интерфейс log4net. Компания NH внутренне запрашивает фабрику лесозаготовок, когда ей необходимо зайти в журнал. Если никакой другой регистратор не настроен, а сборка log4net присутствует, фабрика возвращает обертку вокруг log4net. Если вы хотите предоставить свои собственные вам просто нужно обеспечить регистратор завода и настроить его как:

<appSettings> 
     <add key="nhibernate-logger" 
        value="MyLoggingLoggerFactory, MyLoggingAssembly"/> 
    </appSettings> 

Как вы догадываетесь, класс MyLoggingLoggerFactory должен реализовать ILoggerFactory. Разумеется, возвращаемые регистраторы должны реализовать IInternalLogger, что, как сказано ранее, является общедоступным, даже если недопустимое имя может ввести в заблуждение. Это старт, который они используют, чтобы быть log4net независимым. В качестве дополнения, если вам вообще не нужен журнал, просто удалите сборку log4net из каталога развертывания: NH будет изящно деградировать и использовать внутренне нулевой регистратор.

+0

+1 Я этого не знал. –

+0

@Jeremy, да, это происходит с некоторой версии 3.x ... –

1

NHibernate больше не ссылается на log4net.dll. Он имеет свой собственный уровень абстракции журнала, однако у них есть встроенная реализация собственной абстракции журнала, которая предназначена для log4net.

Они выполняют это, заставляя CLR загружать сборку log4net, используя отражение, когда вы настроите NHibernate на использование log4net, конечно. См. NHibernate.Log4NetLogger и NHibernate.Log4NetLoggerFactory, используя ваш любимый отражатель, если вас интересует больше.

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