Python 日志模塊詳解


前言

我們知道查看日志是開發人員日常獲取信息、排查異常、發現問題的最好途徑,日志記錄中通常會標記有異常產生的原因、發生時間、具體錯誤行數等信息,這極大的節省了我們的排查時間,無形中提高了編碼效率。所以在程序里邊加入日志模塊很有必要。

日志分類

我們可以按照輸出終端進行分類,也可以按照日志級別進行分類。輸出終端指的是將日志在控制台輸出顯示和將日志存入文件;日志級別指的是 Debug、Info、WARNING、ERROR以及CRITICAL等嚴重等級進行划分。

Python 的 logging

logging提供了一組便利的日志函數,它們分別是:debug()、 info()、 warning()、 error() 和 critical()。logging函數根據它們用來跟蹤的事件的級別或嚴重程度來命名。標准級別及其適用性描述如下(以嚴重程度遞增排序):

 

日志輸出

  • 輸出到控制台

    使用 logging 在控制台打印日志,這里我們用 Pycharm 編輯器來觀察:

  • 保存為.txt文件

    依舊是強大的 basicConfig

    logging.basicConfig(level=logging.DEBUG, filename='coder.log', filemode='a')   # 配置中填寫 filename (指定文件名) 和 filemode (文件寫入方式)

Logging的四大組件的簡單的介紹

在實際的工作或應用中,我們或許還需要指定文件存放路徑、用隨機數作為日志文件名、顯示具體的信息輸出代碼行數、日志信息輸出日期和日志寫入方式等內容。再構思一下:

 

具體代碼:

import os
import logging
import uuid
from logging import Handler, FileHandler, StreamHandler
​
​
class PathFileHandler(FileHandler):
    def __init__(self, path, filename, mode='a', encoding=None, delay=False):
​
        filename = os.fspath(filename)
        if not os.path.exists(path):
            os.mkdir(path)
        self.baseFilename = os.path.join(path, filename)
        self.mode = mode
        self.encoding = encoding
        self.delay = delay
        if delay:
            Handler.__init__(self)
            self.stream = None
        else:
            StreamHandler.__init__(self, self._open())
​
​
class Loggers(object):
    # 日志級別關系映射
    level_relations = {
        'debug': logging.DEBUG, 'info': logging.INFO, 'warning': logging.WARNING,
        'error': logging.ERROR, 'critical': logging.CRITICAL
    }
​
    def __init__(self, filename='{uid}.log'.format(uid=uuid.uuid4()), level='info', log_dir='log',
                 fmt='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
        self.logger = logging.getLogger(filename)
        abspath = os.path.dirname(os.path.abspath(__file__))
        self.directory = os.path.join(abspath, log_dir)
        format_str = logging.Formatter(fmt)  # 設置日志格式
        self.logger.setLevel(self.level_relations.get(level))  # 設置日志級別
        stream_handler = logging.StreamHandler()  # 往屏幕上輸出
        stream_handler.setFormatter(format_str)
        file_handler = PathFileHandler(path=self.directory, filename=filename, mode='a')
        file_handler.setFormatter(format_str)
        self.logger.addHandler(stream_handler)
        self.logger.addHandler(file_handler)
​
​
if __name__ == "__main__":
    txt = "謝謝關注玩轉機器學習的博客園"
    log = Loggers(level='debug')
    log.logger.info(4)
    log.logger.info(5)
    log.logger.info(txt)
 

 

參考鏈接:http://blog.itpub.net/31557738/viewspace-2220741/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM