logging日誌模塊

1.什麼是日誌級別

  • 日誌級別是日誌的嚴重程度,若是設置的日誌級別低於logging模塊設置的級別,那麼將被忽略;html

  • warning是默認的日誌級別,criticalerror的級別高於warning,而infodebug級別高於warning2d143e117de30d40.pngapp

2.日誌級別實例

咱們知道默認的日誌級別是warning,那下面咱們經過一個實例來對比一下warning日誌級別和其餘的日誌級別的等級高級,看看若是設置的日誌級別低於logging模塊設置的級別,那麼將被忽略這個結論是否正確函數

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

經過輸出結果,咱們知道了上面的那個結論是正確的啦~測試

咱們再用其餘的日誌級別實踐一下,日誌級別爲DEBUG,那隻要日誌級別比DEBUG高的都會打印;this

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

3.日誌格式參數有哪些

  • %(levelno)s:打印日誌級別的數值;命令行

  • %(levelname)s:打印日誌級別的名稱;線程

  • %(pathname)s:打印當前執行程序的路徑,其實就是sys.argv[0];debug

  • %(filename)s:打印當前執行程序名;日誌

  • %(funcName)s:打印日誌的當前函數;code

  • %(lineno)d:打印日誌的當前行號;

  • %(asctime)s:打印日誌的時間;

  • %(thread)d:打印線程ID;

  • %(threadName)s:打印線程名稱;

  • %(process)d:打印進程ID;

  • %(processName)s:打印線程名稱;

  • %(module)s:打印模塊名稱;

  • %(message)s:打印日誌信息;

4.日誌時間格式化

打印日誌的時候,時間精確到了毫秒,但有時候咱們不須要精確到毫秒,那要怎麼辦?能夠使用日誌時間格式化,也就是設置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';

5.日誌輸出處理 Handler

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 級別')  # 會打印
  • handler的level級別必須大於等於logger實例的level級別纔有意義,若是日誌的級別低於logger的級別是沒法進入到logger的;

  • 日誌的輸出能夠是控制檯,能夠是文件, 默認是終端 stderr;

  • logger實例有繼承關係,若是子logger沒有設置level和handler,那麼從父logger中繼承;

  • 每個logger實例,默認有一個handler,StreamHandler;

  • 每個logger實例都有一個propagate屬性,控制日誌信息是否向父類傳遞, 默認propagate爲True,則向父類傳遞日誌信息;

6.第三方日誌模塊structlog的使用

安裝命令行:

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進行打印了;

7.自定義全局日誌模塊

使用標準庫logging模塊封裝全局日誌

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
  • 使用標準庫logging模塊封裝全局日誌;

  • 首先須要構造一個類,而後初始化這個類,設置對應五個日誌級別的五個函數,最後實例化這個類,就能夠經過實例對象直接打印了;

參考:https://www.9xkd.com/user/plan-view.html?id=4239617430

相關文章
相關標籤/搜索