簡體   English   中英

log4net自定義追加程序依賴項

[英]log4net custom appender dependency

我將實現一個log4net自定義追加程序。 我的Appender工作正常,但是在重構期間,我想隔離責任,因此我需要注入一個接口。 我寫了一些代碼,所以你可以理解

namespace WebServiceLogger.Interfaces
{
    public interface IClientService
    {
        void SendLog(string logToSend);
    }
}

這是我的Appender,現在通過郵件發送日志,但是明天我想使用相同的附加程序將日志發送到Web服務。

using log4net.Appender;
using log4net.Core;
using WebServiceLogger.Interfaces;

namespace WebServiceLogger
{
    public class WebServiceLogAppender : AppenderSkeleton
    {
        private IClientService _clientService;

        //Url property is declared with tag in my log4net.config tag
        public string Url { get; set; }     
        public WebServiceLogAppender()
        {
            InitializeClientService(); 
        }

        protected override void Append(LoggingEvent loggingEvent)
        {
            var log = RenderLoggingEvent(loggingEvent);
            _clientService.SendLog(log);
        }

        private void InitializeClientService()
        {
            var smtpClientFactory = new SmtpClientFactory();
            var mailMessageFactory = new MailMessageFactory();
            _clientService = new EmailClientService(smtpClientFactory,mailMessageFactory)
        }
    }
}

還有一個實現IClientService的類

using System.Net.Mail;
using WebServiceLogger.Interfaces;

namespace WebServiceLogger
{
    public class EmailClientService : IClientService
    {
        private readonly SmtpClient _smtpClient;
        private readonly IMailMessageFactory _mailMessageFactory;

        public EmailClientService(ISmtpClientFactory smtpClientFactory, IMailMessageFactory mailMessageFactory)
        {
            _smtpClient = smtpClientFactory.Create("username", "password");
            _mailMessageFactory = mailMessageFactory;
        }

        public void SendLog(string logToSend)
        {
            var message = _mailMessageFactory.CreateMailMessage(logToSend);
            _smtpClient.Send(message);
        }
    }
}

我不想在此類中連接Web服務,但我只有一個無參數的構造函數。

答案是,我可以在log4net.config中指定實現IClientService接口的一個類的對象嗎?

由於log4net本身會創建附加程序,因此無法使用構造函數或屬性注入,並且無法在config中指定類:如果您確實只想在配置中指定實現IClientService的類的名稱並創建,就可以在運行時使用它,但這並不是真正可取的。

如果您打算減少代碼重復,那么可以為您的自定義記錄器創建一個基類:您可以混合並匹配配置文件中的附加程序。

public abstract class BaseWebServiceLogAppender : AppenderSkeleton
{
    protected IClientService _clientService;

    //Url property is declared with tag in my log4net.config tag
    public string Url { get; set; }

    public BaseWebServiceLogAppender()
    {
        InitializeClientService();
    }

    protected override void Append(LoggingEvent loggingEvent)
    {
        var log = RenderLoggingEvent(loggingEvent);
        _clientService.SendLog(log);
    }

    protected abstract void InitializeClientService();
}

public class EmailWebServiceLogAppender : BaseWebServiceLogAppender
{
    protected override void InitializeClientService()
    {
        var smtpClientFactory = new SmtpClientFactory();
        var mailMessageFactory = new MailMessageFactory();
        _clientService = new EmailClientService(smtpClientFactory,mailMessageFactory)
    }
}

public class SmsWebServiceLogAppender : BaseWebServiceLogAppender
{
    protected override void InitializeClientService()
    {
        _clientService = new SmSClientService(…);
    }
}

不確定您使用的是哪個容器。 就我而言,我正在使用Unity,並且能夠在創建容器后通過容器運行追加器實例:

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類中填充注入屬性:

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

    ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM