log4netがNHと一緒に登場し、OR-Mapperに必須だった時代(それほど昔ではありませんが)を覚えています。現在は必須ではありませんが、オプションです。
これがNHibernateによってどのように達成されるのか本当に疑問に思います。誰かが一言で説明できれば、それは大歓迎です!
log4netがNHと一緒に登場し、OR-Mapperに必須だった時代(それほど昔ではありませんが)を覚えています。現在は必須ではありませんが、オプションです。
これがNHibernateによってどのように達成されるのか本当に疑問に思います。誰かが一言で説明できれば、それは大歓迎です!
NHibernateには、以下のように定義されたロガーを作成するためのILoggerFactoryがあります。
public interface ILoggerFactory
{
IInternalLogger LoggerFor(string keyName);
IInternalLogger LoggerFor(System.Type type);
}
IInternalLogger
名前がまったく内部的ではないことを示すインターフェースは、実際のロガーインターフェースであり、当然のことながら、のインターフェースを正確にマップしILog
ますlog4net
。NHは、ログを記録する必要がある場合、ロガーファクトリに内部的に問い合わせます。他のロガーが構成されておらず、log4netアセンブリが存在する場合、ファクトリはlog4netのラッパーを返します。独自のものを提供する場合は、ロガーファクトリを提供し、次のように構成する必要があります。
<appSettings>
<add key="nhibernate-logger"
value="MyLoggingLoggerFactory, MyLoggingAssembly"/>
</appSettings>
ご想像のとおり、クラスMyLoggingLoggerFactoryはを実装する必要がありますILoggerFactory
。もちろん、返されたロガーはIInternalLogger
、不幸な名前が誤解を招く可能性がある場合でも、前に述べたように公開されていることを実装する必要があります。これは、彼らがlog4net
独立していたために使用する戦略です。さらに、ログがまったく必要ない場合は、デプロイディレクトリからlog4netアセンブリを削除するだけです。NHは正常に機能を低下させ、内部でnullロガーを使用します。
NHibernateはlog4net.dllを参照しなくなりました。独自のロガー抽象化レイヤーがありますが、log4net用に設計された独自のロガー抽象化の実装が組み込まれています。
もちろん、log4netを使用するようにNHibernateを設定する場合、リフレクションを使用してCLRにlog4netアセンブリをロードさせることでこれを実現します。さらに興味がある場合は、お気に入りのリフレクターを使用してNHibernate.Log4NetLoggerおよびNHibernate.Log4NetLoggerFactoryを参照してください。