簡單實用:
# -*- coding:utf-8 -*-
import logging
logging.debug('debug message')
logging.info('info message')
logging.warn('warn message')
logging.error('error message')
logging.critical('critical message')
輸出
WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message
由此可知,默認(rèn)配置為:
默認(rèn)等級:warning
默認(rèn)格式:%(levelname)s -%(name)s - %(message)s'
默認(rèn)名稱:root

默認(rèn)配置
日志等級
從上到下等級從低到高
-DEBUG:詳細(xì)信息,典型地調(diào)試問題時會感興趣
-INFO:證明事情按預(yù)期工作
-WARNING:明發(fā)生了一些意外,或者不久的將來會發(fā)生問題(如‘磁盤滿了’)。軟件還是在正常工作
-ERROR:由于更嚴(yán)重的問題,軟件已不能執(zhí)行一些功能了
-CRITICAL:嚴(yán)重錯誤,表明軟件已不能繼續(xù)運行了
幾個重要的概念
-Logger 記錄器,暴露了應(yīng)用程序代碼能直接使用的接口。
-Handler 處理器,將(記錄器產(chǎn)生的)日志記錄發(fā)送至合適的目的地。
-Filter 過濾器,提供了更好的粒度控制,它可以決定輸出哪些日志記錄。
-Formatter 格式化器,指明了最終輸出中日志記錄的布局。
原理
樹形結(jié)構(gòu)

樹形結(jié)構(gòu)
工作流程

工作流程
簡單應(yīng)用
# encoding: utf-8
#@author: chenjunhua
#time: 2019/1/10 11:52
import logging
#輸出格式
formatter = logging.Formatter('%(filename)s-%(lineno)d-%(asctime)s-%(levelname)s - %(message)s')
#輸出到文件
handler = logging.FileHandler("log.txt")
handler.setLevel(logging.CRITICAL)
handler.setFormatter(formatter)
#輸出到屏幕
console = logging.StreamHandler()
console.setFormatter(formatter)
console.setLevel(logging.INFO)
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.INFO)
logger.addHandler(handler)
logger.addHandler(console)
if __name__ == '__main__':
logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")
有用的format格式
| 格式 | 描述 |
|---|---|
| %(levelno)s | 打印日志級別的數(shù)值 |
| %(levelname)s | 打印日志級別名稱 |
| %(pathname)s | 打印當(dāng)前執(zhí)行程序的路徑 |
| %(filename)s | 打印當(dāng)前執(zhí)行程序名稱 |
| %(funcName)s | 打印日志的當(dāng)前函數(shù) |
| %(lineno)d | 打印日志的當(dāng)前行號 |
| %(asctime)s | 打印日志的時間 |
| %(thread)d | 打印線程id |
| %(threadName)s | 打印線程名稱 |
| %(process)d | 打印進(jìn)程ID |
| %(message)s | 打印日志信息 |