首頁 > 軟體

python logging模組的分檔案存放詳析

2022-07-15 18:00:03

前言:

如果使用進到的紀錄檔檔案方法:logging.FileHandler,會導致紀錄檔資訊全部存放在一個紀錄檔檔案中,不利於後面對紀錄檔檔案的使用。
下面分享常見的兩種分檔案儲存紀錄檔的方法。
delay = True 引數避免了出現多程序中讀取紀錄檔許可權的問題

TimedRotatingFileHandler 根據時間建立紀錄檔檔案

TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None)

atTime 與 when引數之間的關係

RotatingFileHander 根據紀錄檔檔案大小建立紀錄檔檔案

RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False)

分檔案時,PermissionError例外處理

異常資訊:

--- Logging error ---
 Traceback (most recent call last):
 '省略部分資訊'
 PermissionError: [WinError 32] 另一個程式正在使用此檔案,程序無法存取。

解決方法:

設定 delay=True使用第三方庫 concurrent_log_handler.ConcurrentRotatingFileHandler

程式碼實現:customer_log.py

import logging
from logging import handlers
from concurrent_log_handler import ConcurrentRotatingFileHandler
def set_basic_logger():
    path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    log_path = path + '/Log/'
    log_file = log_path + 'mockSystem.log'
    err_file = log_path + 'mockSystemErr.log'
    
    # 客製化輸出格式
    formatter = logging.Formatter(
        '[%(asctime)s] %(filename)s -> %(funcName)s line:%(lineno)d [%(levelname)s] : %(message)s')

    # # 所有紀錄檔在一個檔案中儲存
    # handler = logging.FileHandler(log_file, encoding='utf-8', mode='a+')
    # 按天分檔案儲存,儲存最近30天的紀錄檔
    handler = handlers.TimedRotatingFileHandler(log_file, when='d', interval=1, backupCount=30, encoding='utf-8', delay=True)
    # 按檔案大小分檔案儲存,每個檔案10位元組,保留10個檔案
    # handler = handlers.RotatingFileHandler(log_file, maxBytes=10, backupCount=10,
    #                                        encoding='utf-8', delay=True)
    # 按檔案大小分檔案儲存,每個檔案10位元組,保留10個檔案
    # handler = ConcurrentRotatingFileHandler(log_file, maxBytes=10, backupCount=10)
    handler.setLevel(logging.INFO)
    handler.setFormatter(formatter)
    # err_handler = ConcurrentRotatingFileHandler(err_file, encoding='utf-8', mode='a+')  # 輸出到err_log檔案
    err_handler = handlers.TimedRotatingFileHandler(err_file, when='d', interval=1, backupCount=30,
                                                   encoding='utf-8', delay=True)
    # err_handler = handlers.RotatingFileHandler(err_file, maxBytes=10, backupCount=10,
    #                                            encoding='utf-8', delay=True)
    # err_handler = ConcurrentRotatingFileHandler(err_file, maxBytes=10, backupCount=10)
    err_handler.setLevel(logging.WARNING)
    err_handler.setFormatter(formatter)

    logging.basicConfig(
        level=logging.DEBUG,
        format='[%(asctime)s] %(filename)s -> %(funcName)s line:%(lineno)d [%(levelname)s] : %(message)s',
        handlers=[handler, err_handler]
    )

在專案主程式中使用時:main.py

from customer_log imoprt set_basic_logger
import mu
set_basic_logger()
mu.show_cur_info()

在專案其他模組使用時:mu.py

import logging
def show_cur_info():
	msg = 'dddddd'
	print(msg)
	logging.info(msg

到此這篇關於python logging模組的分檔案存放詳析的文章就介紹到這了,更多相關python logging模組內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com