使用Python logging模組已經有一段時間了,為了更好的理解log工作方式,看了一下其源碼,後總結如下: 日誌模組中有以下核心組件:
- 1.Logger類:Tlog類
- 2.Filter類:過濾器類(是Logger、Handler等類父類)
- 3.Handler類:Tlog類,有各種子類(FileHandler,StreamHandler等)
- 4.LogRecord類:日誌記錄對象,代表一條日誌記錄
- 5.Manager類:日誌對象管理器,維護所有Log執行個體,和其父子關係
- 6.Formatter類:日誌記錄格式化對象
1. logging模組的日誌的根為RootLogger看下面範例程式碼:
logging.basicConfig()
logging.info('')
或
logger = logging.getLogger()
logger.info('')
其都是使用RootLogger,name為'root',level為WARNING,我理解成日誌樹的根(最高父日誌執行個體)。
2.logging root看下面的範例程式碼:
logger1 = logging.getLogger('example')
print logger1.parent.name
#output
root
從上可看出,任何Logger執行個體,都是RootLogger的子節點,root是任何Logger name的最高父節點
3.logging 父子關係
看下面範例程式碼
logger1 = logging.getLogger('example')
logger2 = logging.getLogger('example.child1')
logger2 = logging.getLogger('example.child2')
print logger1.parent.name
print logger2.parent.name
#output
root
example
example
其父子結構如下:
-root
-example
-example.child1
-example.child2
4.logging.config.fileConfig
其原理就是從logconfig設定檔中讀取filters,formmaters,handlers,loggers等資訊,最後產生一個預置的logger執行個體池, 在外部使用:
logging.config.fileConfig("logging.conf")
#create logger
logger = logging.getLogger("example")
其原理是先從預置的日誌管理器中檢索有無name為example的log執行個體,如果有則直接使用,若沒有,則新增。