Orchard源碼:Logging

試着用markdown寫些東西。貌似博客園支持的還有問題,代碼片斷顯示錯位,還得另外上傳圖片。仍是用普通方法寫寫隨筆好了。html

Logging相對也是比較鬆耦合的模塊,能夠隨時提取出來用在本身的項目中。其實說到底它仍是用的log4net。先看一下幾個文件。編程

image

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實現動態依賴注入。

相關文章
相關標籤/搜索