zl程序教程

您现在的位置是:首页 >  Python

当前栏目

Python日志模块封装

2023-02-18 16:33:17 时间


一、先上结论

Python logging模块进行二次封装

# -*- coding:utf-8 -*-
# 作者:IT小学生蔡坨坨
# 博客:caituotuo.top
# 时间:2022/3/16 20:10
# 功能:日志模块封装

import os
import time
import logging
from logging import handlers

from utils.get_path_info import GetPathInfo


class GetLogger(object):
    """ 日志封装类 """

    @classmethod
    def get_logger(cls):
        # logger = logging.getLogger(__name__) # 不会打印 HTTP General 信息
        log = logging.getLogger()
        level_relations = {
            'NOTSET': logging.NOTSET,
            'DEBUG': logging.DEBUG,
            'INFO': logging.INFO,
            'WARNING': logging.WARNING,
            'ERROR': logging.ERROR,
            'CRITICAL': logging.CRITICAL
        }  # 日志级别关系映射

        # 创建日志存放的目录
        project_path = GetPathInfo().get_project_path()  # get_project_path()获取项目根目录
        logs_dir = project_path + "logs"
        if os.path.exists(logs_dir) and os.path.isdir(logs_dir):
            pass
        else:
            os.mkdir(logs_dir)
        # 日志文件以日期命名
        log_file_name = '%s.log' % time.strftime("%Y-%m-%d", time.localtime())
        log_file_path = os.path.join(logs_dir, log_file_name)

        rotating_file_handler = handlers.TimedRotatingFileHandler(filename=log_file_path,
                                                                  when='D',  # 按天分隔,一天一个文件
                                                                  interval=30,
                                                                  encoding='utf-8')

        # 日志输出格式
        fmt = "%(asctime)s %(levelname)s %(pathname)s %(lineno)d %(message)s"
        formatter = logging.Formatter(fmt)
        rotating_file_handler.setFormatter(formatter)

        # 加上判断,避免重复打印日志
        if not log.handlers:
            # 控制台输出
            console = logging.StreamHandler()
            console.setLevel(level_relations["NOTSET"])
            console.setFormatter(formatter)
            # 写入日志文件
            log.addHandler(rotating_file_handler)
            log.addHandler(console)
            log.setLevel(level_relations['DEBUG'])
        return log


if __name__ == '__main__':
    logger = GetLogger().get_logger()
    logger.debug('调试')
    logger.info('信息')
    logger.warning('警告')
    logger.error('报错')
    logger.critical('严重')

二、logging.Formatter自定义日志格式

1. For example

fmt = "%(name)s %(asctime)s %(created)f %(relativeCreated)d %(msecs)d %(levelname)s %(levelno)s %(pathname)s %(filename)s %(module)s %(funcName)s %(lineno)d %(process)d %(thread)d %(threadName)s %(message)s"
formatter = logging.Formatter(fmt)

结果:
root 2022-03-20 03:00:05,449 1647716405.449377 28 449 DEBUG 10 F:/Desktop/qys_priv_open/utils/get_logger.py get_logger.py get_logger <module> 68 7420 3244 MainThread 调试

2. 常用的格式字符串

格式字符串 作用 例如
%(name)s Logger的名称 root
%(asctime)s 打印日志的时间,字符串形式(datetime.datetime.now()的返回值) 2022-03-20 02:30:12,776(逗号后面是毫秒)
%(created)f 日志打印的时间,用Unix标准地表示时间的浮点数(time.time()的返回值) 1647715277.792532
%(relativeCreated)d 输出日志信息的耗时,从Looger创建开始计时,以毫秒为单位 35
%(msecs)d 打印日志的时间的毫秒部分 449
%(levelname)s 日志级别,文本形式 “DEBUG”、“INFO”、“WARNING”、“ERROR”、“CRITICAL”
%(levelno)s 日志级别,数字形式 DEBUG=10、INFO=20、WARNING=30、ERROR=40、CRITICAL=50
%(pathname)s 调用日志输出函数的模块的完整路径名 F:/Desktop/qys_priv_open/utils/get_logger.py
%(filename)s 调用日志输入函数的模块的文件名 get_logger.py
%(module)s 调用日志输出函数的模块名 get_logger
%(funcName)s 调用日志输出函数的函数名 <module>
%(lineno)d 调用日志输出函数的语句所在的代码行 69
%(process)d 进程ID 7840
%(thread)d 线程ID 6004
%(threadName)s 线程名 MainThread
%(message)s 输出的日志信息 这是一条测试日志

原文链接:https://caituotuo.top/11abedfb.html

微信公众号:IT小学生蔡坨坨