2012-02-10 100 views
9

我正在与Orchard CMS合作,对我来说更好的CMS。我想了解它如何进行日志记录以及我是否可以添加自己的日志记录。我看到果园使用NullLogger类,它没有工作。我打开了App_Data.Logs文件夹,并看到有日志文件。但是如何?我在代码中搜索替换NullLogger与log4net(我猜这是log4net,因为日志格式和log4net.config的格式非常相似),但我还没有找到这个技巧。 有人可以回答我:Orchard CMS如何进行日志记录?

  1. Orchard如何进行日志记录?
  2. 我是否可以添加自己的记录器,如果是,有哪些最佳实践可以做到这一点?

谢谢安德烈。

回答

16

Autofac模块(确切地说Orchard.Logging.LoggerModule)处理它。基本上 - 它扫描每个依赖项并填充​​类型的所有属性,并引用相应的记录器实例。每个依赖项都会获得自己的记录器,其名称等于包含类的完整类型名称(包括名称空间)的

NullLogger只是一个占位符,因此在属性由Autofac设置之前,访问属性不会抛出NullReferenceException

扩展默认的日志作为它会涉及做三件事情相当复杂的任务:

  • 创建ILoggerFactory(就像默认Orchard.Logging.CastleLoggerFactory)的自定义实现和
  • 创建Autofac模块在容器寄存器该实现(如所提到的LoggerModule确实)
  • 抑制当前的默认升通过装饰你的新的与[OrchardSuppressDependency("Orchard.Logging.LoggingModule")]

UPDATE ogging模块

刚刚意识到我没有解决此问题的最重要的部分:) 是,果园使用log4net的所以你可通过Config/log4net.config文件更改默认设置。

+0

非常感谢,对我很有帮助。但我还不明白在当前使用的记录器配置的Orchard的哪个地方。它在log4net.config文件或其他地方? – 2012-02-10 10:48:29

+0

好的,我找到了答案。它确实使用log4net.config文件。谢谢。 – 2012-02-10 11:42:53

+0

有没有一种方法可以创建一个记录器来处理特定命名空间的所有日志记录?或者是特定的班级? – 2014-12-10 19:35:21

1

有一篇关于Orchard Logging如何工作的文章。 (我不确定是否可以复制和粘贴整篇文章)。这是链接:Injection Logger in Orchard

因此,关键是这样的:

每当类需要一个Logger实例,它需要做的一切都是为了 声明ILogger属性,仅此而已。然后,在你的班级里,你可以使用这个属性来随时登录

这是怎么完成的?

当Orchard web应用程序启动时,OrchardStarter将使用 来完成大部分的注册工作。

几句话,它会在所有项目的所有代码,获取所有使用的ILogger属性的类,并实现它,你(如果未实现),使用城堡的记录器工厂。