試着用markdown寫些東西。貌似博客園支持的還有問題,代碼片斷顯示錯位,還得另外上傳圖片。仍是用普通方法寫寫隨筆好了。html
Logging相對也是比較鬆耦合的模塊,能夠隨時提取出來用在本身的項目中。其實說到底它仍是用的log4net。先看一下幾個文件。編程
1.ILogger。俗話說面向接口編程,這個就是Orchard中Logger的接口,提供了2個方法markdown
public interface ILogger { bool IsEnabled(LogLevel level); void Log(LogLevel level, Exception exception, string format, params object[] args); }
2.CastleLogger設計
ILogger的默認實現,系統就是用的這個,看名稱是CastleLogger,不要被迷惑。系統中Castle.Core.Logging.ILogger也是一個接口,log4net纔是真正的實現。代理
3.LoggingExtensions日誌
ILogger的一些擴展方法,如Error,Debug,Warning等,就是不一樣的LogLevel。orm
4.NullLoggerhtm
也是ILogger的實現,就是啥事不幹,這樣ILogger能夠根據不一樣的上下文環境選擇是否輸出Log。對象
5.OrchardFileAppenderblog
擴展了log4net 的 RollingFileAppender。這樣當日志文件被鎖定時,它能夠輸出到另外的文件中。
6.ILoggerFactory,CastleLoggerFactory,NullLoggerFactory
第一個是是接口,後2個是實現
7.OrchardLog4netFactory
這個Factory 繼承的是AbstractLoggerFactory,這是一個真的「Factory」,CastleLoggerFactory是他的一層代理
8.LoggingModule
用於註冊Logging模塊
以上是大體介紹,光看名字就知道用了好幾個design pattern。瞬間感受高大上。
這樣設計顯而易見的是能夠方便實現本身的ILoggerFactory和ILogger。另外一個是在注入ILogger時候,能夠把當前使用Ilogger的組件如注給它。
普通log4net實例化方法:
private static readonly ILog logger=LogManager.GetLogger(typeof(類))
這樣的話就查看日誌文件就能夠知道日誌是哪一個類生成的
Orchard中的依賴注入
public class Thing { public ILogger Logger { get; set; } }
在注入的時候已經把Thing這個類關聯到了這個ILogger中。而不用每次都去指定具體的類。
這種運行時動態構造對象在Orchard中使用不少。請查看LoggingModule.AttachToComponentRegistration方法。詳細以後會專門介紹如何使用Autofac實現動態依賴注入。