为什么log4net的命名记录器?(Why have named logger in Log4Net

2019-07-03 20:44发布

我一直在研究如何注入log4net的ILog的使用到温莎城堡类。 在大多数实施例中,我看到城堡温莎可以提供一个“引导”,其提供属性注射和喷射ILogger(未的ILog)。 我已经发现当使用构造器注射只是一个例子,并且不使用辅助器的方法(请参见城堡温莎依赖注入:使用呼叫者类型作为参数 )

在所有这些例子,似乎log4net的希望有一个名为记录。 大多数示例参考log4net的静态方法LogManager.GetLogger(类名称这里)。 这使得以限定用于CastleWindsor的依赖关系,而无需使用反射,或主持人方法的挑战(可以协调器方法与构造函数注射使用???)。 当伊利亚高根(URL上面......)的问题来看,我想我不明白为什么我需要,甚至想指定logger。 我不能同名到处使用记录?

例如,我不能只是注册XXX的硬编码名称的记录? (这似乎做工精细,并在年底,我只是想记录 - 我不关心哪个记录器记录的吧...)是否有一个范围的问题吗? 是否有内存泄漏问题? 为什么不能/不应该记录器是一个单身?

public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(
                Component.For<log4net.ILog>().UsingFactoryMethod(() => log4net.LogManager.GetLogger("xxx"))
                );
        }

更新:

在一些研究中,硬编码命名为记录器可以使用 - 如在我的上述例子XXX,但如果记录器的配置的记录器名称输出到日志文件,并且如果记录器名称被动态地分配给相同的名称作为方法或类,你自动地获得参考日志源自何处。 日志文件中的环境可以是非常有益的。

当专门针对构造函数注入,似乎有5点可能的选择...

  • 使用独立的,并没有使用命名记录器(因而日志文件未报道)
  • 与男星注射使用反射(如被看见在伊利亚高根的例子)
  • 使用属性注入(通过主持人)
  • 使用后急剧AOP IL注射用于记录
  • 使用CTOR注射(通过主持人)

Answer 1:

使用温莎城堡到DI的log4net的日志推荐的方法是使用设施。 一个已经为log4net的创建和它的使用是体现在本教程中 。



Answer 2:

好问题。

总之,因为这样的名字被用于过滤日志输出(详见log4net的文档)的log4net都想命名记录器。 类型名称仅仅是一个方便的惯例,因为它为您提供这方面的额外位,并加上正确使用命名空间可以让你不喜欢的东西说“记录所有NHibernate的消息一个单独的文件”

这也是为什么通常,如果你不使用容器,你有一个单一的,静态的记录器属性/类中的字段。

ILogger你指的是对日志记录在城堡的抽象,其中之一可以是log4net的。

虽然LoggingFacility提供开箱即用的支持对提供的依赖ILogger它绝不强迫你这样做。

ILog登记的,应当改写如下(我从记忆写这篇所以细节可能会略有不同):

Component.For<log4net.ILog>()
    .UsingFactoryMethod((k, c) => log4net.LogManager.GetLogger(c.RequestedType))
    .LifestyleTransient()

c.RequestedType会给你你满足的依赖,使其瞬间将避免各类会重用无论第一种类型来命名记录器的单个实例要求的依赖是问题有类型。



文章来源: Why have named logger in Log4Net?