autofac を使用していて、WebApi コントローラーを登録しようとしています。各コントローラーはLogging.ILog
、コンストラクター パラメーターとして一意の値を取ります (これは、log4net ILog に適応する私の ILog です)。ロガーが解決されたら、解決対象のコントローラーに従って名前を付けたいと思います。
このようなもの:
builder.Register(c => log4net.LogManager.GetLogger("NEED CONTROLLER NAME HERE"));
builder.Register(c => new Logging.Adapters.Log4NetAdapter(c.Resolve<log4net.ILog>()));
builder.RegisterType<Logging.Adapters.Log4NetAdapter>().As<Logging.ILog>();
builder.RegisterApiControllers(System.Reflection.Assembly.GetExecutingAssembly());
コントローラーのタイプ名に従って、各 WebApi コントローラーに個々のロガー名を受け取る方法はありますか?
以下は機能しているようですが、理想的ではないようです。
builder.Register(c => log4net.LogManager.GetLogger(c.ComponentRegistry.Registrations.Last().Activator.LimitType.Name));
builder.Register(c => new Logging.Adapters.Log4NetAdapter(c.Resolve<log4net.ILog>()));
builder.RegisterType<Logging.Adapters.Log4NetAdapter>().As<Logging.ILog>();
builder.RegisterApiControllers(System.Reflection.Assembly.GetExecutingAssembly());
私はautofacが初めてなので、ご容赦ください。
上記に気付いた場合は、コントローラーと実際のlog4netの間にいくつかの登録レイヤーがあるように、追加のレイヤーまたは独自のILogおよびLog4NetAdapter/Wrapperがあります。
次のようなものが必要です:
APIController <- Logging.ILog <- Logging.Adapters.Log4NetAdapter <- log4net.ILog <- log4net.LogManager.GetLogger(APIController-Name)