加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在自定义Log4Net appender中使用IoC

发布时间:2020-12-16 02:01:42 所属栏目:百科 来源:网络整理
导读:不幸的是,当我使用Log4Net搜索涉及Unity或IoC的任何内容时,我已经搜索了很长一段时间,我得到的唯一结果是如何通过IoC自动填充ILog.这不是我想要做的. 我有一个自定义Appender,通过WCF将数据传输到服务器.我想要做的是传递一个工厂方法,最好是由Unity生成的方
不幸的是,当我使用Log4Net搜索涉及Unity或IoC的任何内容时,我已经搜索了很长一段时间,我得到的唯一结果是如何通过IoC自动填充ILog.这不是我想要做的.

我有一个自定义Appender,通过WCF将数据传输到服务器.我想要做的是传递一个工厂方法,最好是由Unity生成的方法,为我创建WCF客户端类,这样我就可以在单元测试期间替换存根的真实客户端类.问题是我找不到任何关于如何将参数传递给自定义log4net appender的解释.

以下是我通常使用Unity实现此操作的方法.

public class WcfAppender : BufferingAppenderSkeleton
{
    public WcfAppender(Func<ClientLoggerClient> loggerClientFactory) //How do I get this Func passed in?
    {
        LoggerClientFactory = loggerClientFactory;
    }


    private readonly Func<ClientLoggerClient> LoggerClientFactory; 
    private static readonly ILog Logger = LogManager.GetLogger(typeof(WcfAppender));
    private static readonly string LoggerName = typeof(WcfAppender).FullName;

    public override void ActivateOptions()
    {
        base.ActivateOptions();
        this.Fix = FixFlags.All;
    }

    protected override bool FilterEvent(LoggingEvent loggingEvent)
    {
        if (loggingEvent.LoggerName.Equals(LoggerName))
            return false;
        else
            return base.FilterEvent(loggingEvent);
    }


    protected override void SendBuffer(LoggingEvent[] events)
    {
        try
        {
            var client = LoggerClientFactory();
            try
            {
                client.LogRecord(events.Select(CreateWrapper).ToArray());
            }
            finally
            {
                client.CloseConnection();
            }
        }
        catch (Exception ex)
        {
            Logger.Error("Error sending error log to server",ex);
        }
    }

    private ErrorMessageWrapper CreateWrapper(LoggingEvent arg)
    {
        var wrapper = new ErrorMessageWrapper();

        //(Snip)

        return wrapper;
    }
}

但是我不调用container.Resolve< WcfAppender>()在log4net库中调用新的WcfAppender().如何告诉log4net库使用新的WcfAppender(factoryGeneratedFromUnity)呢?

解决方法

我能够在创建后通过Unity容器运行appender实例:

ILog logger = LogManager.GetLogger("My Logger");
IAppender[] appenders = logger.Logger.Repository.GetAppenders();
foreach (IAppender appender in appenders)
{
    container.BuildUp(appender.GetType(),appender);
}

container.RegisterInstance(logger);

BuildUp()方法将填充appender类中的injection属性:

public class LogDatabaseSaverAppender : AppenderSkeleton
{
    [Dependency]
    public IContextCreator ContextCreator { get; set; }

    ...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读