Python 项目 日志记录 Logger 实践案例
定义BaseLogger
:base_logger.py
# -*- coding: utf-8 -*-
import sys
import logging
import logging.handlers
from typing import Union
from cfg.common import PROJ_ROOT, PROJ_NAME
LOG_DIR = PROJ_ROOT.joinpath('logs')
LOG_FMTR = logging.Formatter('%(processName)10s:%(threadName)10s - %(asctime)s [%(levelname)-8s] '
'[%(name)-20s - %(filename)s:%(lineno)d %(funcName)20s()]: '
'%(message)s')
LOG_DEFAULT_FILENAME = 'general.log'
_LOG_DEFAULT_FILE_MAXBYTES = 50_000_000
_LOG_DEFAULT_FILE_BACKUPCNT = 5
def get_console_handler(level: Union[str, int]) -> logging.StreamHandler:
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(level)
ch.setFormatter(LOG_FMTR)
return ch
def get_rotate_file_handler(level: Union[str, int],
filename: str = LOG_DEFAULT_FILENAME) -> logging.handlers.RotatingFileHandler:
filepath = LOG_DIR.joinpath(filename)
rfh = logging.handlers.RotatingFileHandler(filepath, encoding='utf-8',
maxBytes=_LOG_DEFAULT_FILE_MAXBYTES,
backupCount=_LOG_DEFAULT_FILE_BACKUPCNT)
rfh.setLevel(level)
rfh.setFormatter(LOG_FMTR)
return rfh
def _create_base_logger():
logger = logging.getLogger(PROJ_NAME)
logger.setLevel(logging.CRITICAL)
ch = get_console_handler(logging.CRITICAL)
rfh = get_rotate_file_handler(logging.WARN)
logger.addHandler(rfh)
logger.addHandler(ch)
return logger
base_logger = _create_base_logger()
使用base_logger
派生模块级Logger:
from logger.logger import base_logger, get_console_handler
def _create_xxx_logger():
logger = base_logger.getChild(__name__)
logger.setLevel('DEBUG')
if not logger.handlers:
ch = get_console_handler('DEBUG')
logger.addHandler(ch)
fh = get_rotate_file_handler('INFO', f'{__name__}.log')
logger.addHandler(fh)
return logger
_logger = _create_xxx_logger()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)