warning
是默認的日誌級別,critical
和error
的級別高於warning
,而info
和debug
級別高於warning
;
咱們知道默認的日誌級別是warning,那下面咱們經過一個實例來對比一下warning日誌級別和其餘的日誌級別的等級高級,看看若是設置的日誌級別低於logging模塊設置的級別,那麼將被忽略這個結論是否正確html
import logging from datetime import datetime logging.basicConfig(format='%(message)s {}'.format(datetime.now()), level=logging.WARNING) logging.debug('我是 DEBUG 級別的日誌') logging.info('我是 INFO 級別的日誌') logging.warning('我是 WARNING 級別的日誌') logging.error('我是 ERROR 級別的日誌') logging.critical('我是 CRITICAL 級別的日誌') 輸出結果: 我是 WARNING 級別的日誌 2019-04-11 15:37:14.254115 我是 ERROR 級別的日誌 2019-04-11 15:37:14.254115 我是 CRITICAL 級別的日誌 2019-04-11 15:37:14.254115
經過輸出結果,咱們知道了上面的那個結論是正確的啦~app
咱們再用其餘的日誌級別實踐一下,日誌級別爲DEBUG,那隻要日誌級別比DEBUG高的都會打印;函數
import logging from datetime import datetime logging.basicConfig(format='%(message)s {}'.format(datetime.now()), level=logging.DEBUG) logging.debug('我是 DEBUG 級別的日誌') logging.info('我是 INFO 級別的日誌') logging.warning('我是 WARNING 級別的日誌') logging.error('我是 ERROR 級別的日誌') logging.critical('我是 CRITICAL 級別的日誌') 輸出結果: 我是 DEBUG 級別的日誌 2019-04-11 15:39:25.098599 我是 INFO 級別的日誌 2019-04-11 15:39:25.098599 我是 WARNING 級別的日誌 2019-04-11 15:39:25.098599 我是 ERROR 級別的日誌 2019-04-11 15:39:25.098599 我是 CRITICAL 級別的日誌 2019-04-11 15:39:25.098599
%(levelno)s
:打印日誌級別的數值;%(levelname)s
:打印日誌級別的名稱;%(pathname)s
:打印當前執行程序的路徑,其實就是sys.argv[0];%(filename)s
:打印當前執行程序名;%(funcName)s
:打印日誌的當前函數;%(lineno)d
:打印日誌的當前行號;%(asctime)s
:打印日誌的時間;%(thread)d
:打印線程ID;%(threadName)s
:打印線程名稱;%(process)d
:打印進程ID;%(processName)s
:打印線程名稱;%(module)s
:打印模塊名稱;%(message)s
:打印日誌信息;打印日誌的時候,時間精確到了毫秒,但有時候咱們不須要精確到毫秒,那要怎麼辦?能夠使用日誌時間格式化,也就是設置datefmt測試
import logging from datetime import datetime logging.basicConfig(format='%(asctime)s %(message)s {}'.format(datetime.now()), level=logging.WARNING, datefmt='%Y-%m-%d') logging.debug('我是 DEBUG 級別的日誌') logging.info('我是 INFO 級別的日誌') logging.warning('我是 WARNING 級別的日誌') logging.error('我是 ERROR 級別的日誌') logging.critical('我是 CRITICAL 級別的日誌') 輸出結果: 2019-04-11 我是 WARNING 級別的日誌 2019-04-11 15:43:41.166245 2019-04-11 我是 ERROR 級別的日誌 2019-04-11 15:43:41.166245 2019-04-11 我是 CRITICAL 級別的日誌 2019-04-11 15:43:41.166245
經過上面的例子,咱們知道能夠使用datefmt來設置打印時間的格式,如打印年月日時分秒爲:datefmt='%Y-%m-%d %H:%M:%S';this
import logging from pprint import pprint logging.basicConfig(format='%(asctime)s %(message)s ', level=logging.DEBUG, datefmt='%Y-%m-%d %H:%M:%S') # 經過logging的工廠方法,返回logger實例 root_logger = logging.getLogger() xkd_logger = logging.getLogger('xkd') root_logger.setLevel(40) # handler的level級別必須大於等於 logger實例的level級別纔有意義 # 若是日誌的級別低於logger的級別是沒法進入到logger的 error_handler = logging.StreamHandler() error_handler.setLevel(level=logging.ERROR) error_handler.setFormatter(fmt=logging.Formatter('%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')) critical_handler = logging.FileHandler(filename='./app.log') critical_handler.setLevel(level=logging.CRITICAL) critical_handler.setFormatter(fmt=logging.Formatter('%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')) root_logger.addHandler(error_handler) root_logger.addHandler(critical_handler) root_logger.info('我是 root 的 INFO 級別的日誌') root_logger.error('我是 root 的 ERROR 級別的日誌') root_logger.critical('我是 root 的 CRITICAL 級別的日誌') pprint(root_logger.handlers) # 子logger xkd_level = xkd_logger.getEffectiveLevel() print(xkd_level) xkd_logger.info('我是 INFO 級別') # 不會打印 xkd_logger.error('我是 error 級別') # 會打印
安裝命令行:spa
pip install structlog # 或者帶顏色打印(若是是打印到文件,最好不要使用帶顏色打印,會有轉義字符) pip install structlog colorama
咱們來看一下structlog的基本使用命令行
from structlog import get_logger log = get_logger() # 能夠直接傳遞key/value log.info("須要打印的信息", out_of_the_box=True, effort=0) # 輸出結果 # 2019-04-11 15:53.19 須要打印的信息 effort=0 out_of_the_box=True
首先須要導入structlog模塊,而後import get_logger類,接着使用get_logger進行實例化,獲得實例對象log,最後就能夠直接使用實例對象log進行打印了;線程
使用標準庫logging模塊封裝全局日誌debug
import logging import getpass import sys import os #定義Mylog類,管理log信息 class MyLog(object): def __init__(self): self.user = getpass.getuser() self.logger = logging.getLogger(self.user) self.logger.setLevel(logging.DEBUG) #日誌文件名 self.logFile = 'debug.log' self.formatter = logging.Formatter('%(asctime)-12s %(levelname)- 8s %(name)-10s %(message)-12s\r\n') #日誌顯示到屏幕並輸出到文檔 self.logHand = logging.FileHandler(self.logFile, encoding='utf-8') self.logHand.setFormatter(self.formatter) self.logHand.setLevel(logging.DEBUG) self.logHandSt = logging.StreamHandler() self.logHandSt.setFormatter(self.formatter) self.logHandSt.setLevel(logging.DEBUG) self.logger.addHandler(self.logHand) self.logger.addHandler(self.logHandSt) #日誌的5個級別對應5個函數 def debug(self, msg): self.logger.debug(msg) def info(self, msg): self.logger.info(msg) def warn(self, msg): self.logger.warning(msg) def error(self, msg): self.logger.error(msg) def critical(self, msg): self.logger.critical(msg) #測試代碼 __name__是訪問當前函數名的方法,若是做爲模塊就不是main函數 下面的方法不會執行 if __name__ == '__main__': mylog = MyLog() mylog.debug(u"I'm 測試中文") mylog.info("I;m info") mylog.warn("warning") mylog.error("Error") mylog.critical("this is a critical") # 輸出: 2019-04-11 16:04:50,836 DEBUG lu I'm 測試中文 2019-04-11 16:04:50,836 INFO lu I;m info 2019-04-11 16:04:50,837 WARNING lu warning 2019-04-11 16:04:50,837 ERROR lu Error 2019-04-11 16:04:50,837 CRITICAL lu this is a critical