1

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)
4

2 に答える 2

0

ラッパーでNLogを使用していますが、確かにlog4netに変換できます。これが私のコードです:

public class LoggingModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.Register((c, p) => GetLogger(p.TypedAs<Type>()));
    }

    protected override void AttachToComponentRegistration(
        IComponentRegistry registry, IComponentRegistration registration)
    {
        registration.Preparing +=
            (sender, args) =>
            {
                var forType = args.Component.Activator.LimitType;

                var logParameter = new ResolvedParameter(
                    (p, c) => p.ParameterType == typeof (ILog),
                    (p, c) => c.ResolveLog(forType));

                args.Parameters = args.Parameters.Union(new[] {logParameter});
            };
    }

    public static ILog GetLogger(Type type)
    {
        return new NLogLogger(type);
    }
}

public static class ResolveLogExtension
{
    public static ILog ResolveLog<TService>(this IComponentContext context)
    {
        return context.ResolveLog(typeof (TService));
    }

    public static ILog ResolveLog(this IComponentContext context, Type type)
    {
        return context.Resolve<ILog>(TypedParameter.From(type));
    }
}

public interface ILog
{
    void Debug(string format, params object[] args);
    void Info(string format, params object[] args);
    void Warn(string format, params object[] args);

    void Error(string format, params object[] args);
    void Error(Exception ex);
    void Error(Exception ex, string format, params object[] args);

    void Fatal(Exception ex, string format, params object[] args);
}

public class NLogLogger : ILog
{
    private readonly Logger _log;

    public NLogLogger(Type type)
    {
        _log = LogManager.GetLogger(type.FullName);
    }

    public void Debug(string format, params object[] args)
    {
        _log.Debug(format, args);
    }

    public void Info(string format, params object[] args)
    {
        _log.Info(format, args);
    }

    public void Warn(string format, params object[] args)
    {
        _log.Warn(format, args);
    }

    public void Error(string format, params object[] args)
    {
        _log.Error(format, args);
    }

    public void Error(Exception ex)
    {
        _log.ErrorException("", ex);
    }

    public void Error(Exception ex, string format, params object[] args)
    {
        _log.ErrorException(string.Format(format, args), ex);
    }

    public void Fatal(Exception ex, string format, params object[] args)
    {
        _log.FatalException(string.Format(format, args), ex);
    }
}
于 2012-09-26T14:35:50.700 に答える