python日志模块回顾

发布时间 2023-12-03 21:44:21作者: 时间完全不够用啊

日志模块配置文件logging.yaml

version: 1
formatters:
  simple:
    format: '[%(asctime)s %(thread)d] [%(levelname)s] %(message)s'  # 日志内容的格式化,具体参数问GPT或百度
    dateformat: '%Y-%m-%d %H:%M:%S.%f'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: simple
    stream: ext://sys.stdout
  console_err:
    class: logging.StreamHandler
    level: ERROR
    formatter: simple
    stream: ext://sys.stderr
  file:
    class: logging.FileHandler  # 文件
    level: DEBUG
    formatter: simple
    mode: a # 追加写入,每次记录日志都在文件后面追加内容
    encoding: utf-8 # 编码
    filename: my_log.log  # 将日志写入的文件,指定路径,只有文件名则是当前路径
loggers:
  simpleExample: # 代码中获取的日志名
    level: DEBUG  # 该日志记录器的级别,从下往上包含
    handlers: [console,file]  # 与上面handlers的自己关联
    propagate: no
#root:
#  level: DEBUG
#  handlers: [file]

 

日志工具类:

#! /usr/bin/env python
# coding=gbk
import datetime
import logging, os
import ctypes
import logging.config

import yaml

from config.pathconfig import PathConfig

FOREGROUND_WHITE = 0x0007
FOREGROUND_BLUE = 0x01  # text color contains blue.
FOREGROUND_GREEN = 0x02  # text color contains green.
FOREGROUND_RED = 0x04  # text color contains red.
FOREGROUND_YELLOW = FOREGROUND_RED | FOREGROUND_GREEN

STD_OUTPUT_HANDLE = -11
std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)


def set_color(color, handle=std_out_handle):
    bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
    return bool


class Logger:

    def __init__(self):
        # 路径配置文件类,管理项目根目录下的文件夹路径
        sp = PathConfig()
        # 从路径config中读取日志文件夹logs的路径,使用当前年月日作为文件名
        path = sp.logs + '/%s.log' % datetime.datetime.now().strftime("%Y-%m-%d")
        self.__create_log_file(path)
        # 读取日志配置文件配置
        with open(sp.config + '/logging.yaml', 'r') as f:
            # 使用Yaml模块加载配置文件内容到字典中
            # yaml.load(f,Loader=yaml.FullLoader)方法是使用PyYAML库加载YAML文件的一种常见方式,使用FullLoader类作为加载器,以确保安全加载YAML数据
            dict_conf = yaml.load(f, Loader=yaml.FullLoader)
        # 将日志的yaml配置文件中文件路径改为自定义
        dict_conf['handlers']['file']['filename'] = path
        # 使用修改后的配置字典来配置日志系统
        logging.config.dictConfig(dict_conf)
        # 获取名为'simpleExample'的日志记录器
        self.logger = logging.getLogger('simpleExample')

    def __create_log_file(self, path):
        file_name = os.path.basename(path)
        file_path = path.replace("/" + file_name, "")
        if not os.path.exists(file_path):
            os.makedirs(file_path)
            # 在指定目录下创建文件
            with open(path, 'w', encoding="utf-8") as f:
                f.write(
                    "############################# %s CREATE NEW LOG FILE #############################\n" % datetime.datetime.now().strftime(
                        "%Y-%m-%d %H:%M:%S"))

    def debug(self, message):
        self.logger.debug(message)

    def info(self, message):
        self.logger.info(message)

    def war(self, message, color=FOREGROUND_YELLOW):
        set_color(color)
        self.logger.warning(message)
        set_color(FOREGROUND_WHITE)

    def error(self, message, color=FOREGROUND_RED):
        set_color(color)
        self.logger.error(message)
        set_color(FOREGROUND_WHITE)

    def cri(self, message):
        self.logger.critical(message)

创建日志文件前需要判断这个文件及其路径是否存在,不存在先创建文件。