对不同的应用程序使用相同的记录器是不是很糟糕

时间:2016-03-29 06:30:13

标签: logging dependency-injection log4net

我有3个不同的应用程序。我在一个共享库中有log4net,它可以在3个应用程序中共享。对所有3种服务使用相同的记录器是不好的做法。 我写过类似的东西

public class Log4netLogger
{
       private ILog _logger = null;
       public Log4netLogger(ILog logger)
       {
           _logger = logger;
       }



       public void write(Level logLevel, string message)
       {
          _logger.Logger.Log(_logger.GetType(),logLevel,message,null);
       }
}

在我的应用程序1 app_start中,我正在注入这样的

 myContainer.RegisterType<ILog>
                        (
                            new ContainerControlledLifetimeManager(),
                            new InjectionFactory(x => LogManager.GetLogger("Application 1"))
                        );

在我的代码中,我使用的是

 _logger =  myContainer.Resolve<log4net.ILog>();
 Log4netLogger logMessage= new Log4netLogger(_logger);
 logMessage.Write
             (
                 log4net.Core.Level.Info,
                 logMessage
              );

此外,我认为这种方法的一个负面因素是我在所有3个应用程序中都安装了log4net。所以我想知道我是做错了什么还是有更好的方法?

1 个答案:

答案 0 :(得分:0)

如果你Log4net 松散耦合,这是一个很好的决定。然后,您可以将记录器放在不同的项目中并由所有应用程序共享。如果您需要并且需要,您可以隐藏中间件项目(服务,dal vs ..)的实现,您可以将界面和实现分离到不同的项目。

然后您的中间件类只知道接口,您可以更改logger的实现而无需重建或重新部署此服务(松散依赖)。

但是你不能在没有实现的情况下运行你的驱动程序项目(主项目),他们必须知道Log4Net(或使用相同接口的另一个库)的实现。

对于失去耦合:您的服务应该使用您的界面而不是log4net.ILog

我对log4net没有经验。但是here,他们将工厂用于log4net。这很好,您的服务将知道您的工厂而不是Log4Net,您的工厂将了解(Log4Net)。

链接上的代码:

public interface ILoggerFactory
{
    ILogger Create(Type type);   
}

public class LoggerFactory : ILoggerFactory
{
    public ILogger Create(Type type)
    {
        return new Log4netLogger(type);
    }
}

但我再说一遍,你不能放弃顶级(驱动)项目的耦合,因为他们必须知道所有的实现,否则他们不能注入。