前言

  • 在 Python 中,可以直接用自带的 logging 模块来记录日志,但是在使用时我们需要配置一些 Handler、Formatter 来进行一些处理,比如把日志输出到不同的位置,或者设置一个不同的输出格式,或者设置日志分块和备份。个人感觉 logging 用起来其实并不是那么好用,主要是配置较为繁琐,相对于新手来说不太友好,那么接下来废话不多说直接上干货代码。

将logging模块封装

  • 首先新建一个log.py的文件

  • 导入需要用到的Python包
import sys
import logging
from settings import *
from os import makedirs
from os.path import dirname, exists
  • 创建Logger类、init初始化函数、get_logger函数
class Logger(object):
    def __init__(self):
        pass
    def get_logger(self,name=None):
        pass
  • 初始化函数添加配置项
# 此处可以新建一个settings.py 来存储这些配置选项 如不想多建其他文件 也可直接在初始化配置
self.loggers = {}
self.LOG_ENABLED = LOG_ENABLED  # 是否开启日志
self.LOG_TO_CONSOLE = LOG_TO_CONSOLE  # 是否输出到控制台
self.LOG_TO_FILE = LOG_TO_FILE  # 是否输出到文件
self.LOG_PATH = LOG_PATH  # 日志文件路径
self.LOG_LEVEL = LOG_LEVEL  # 日志级别
self.LOG_FORMAT = LOG_FORMAT # 每条日志输出格式
  • get_logger函数 判断是否输出到控制台代码
if self.LOG_ENABLED and self.LOG_TO_CONSOLE:
    stream_handler = logging.StreamHandler(sys.stdout)
    stream_handler.setLevel(level=self.LOG_LEVEL)
    formatter = logging.Formatter(self.LOG_FORMAT)
    stream_handler.setFormatter(formatter)
    logger.addHandler(stream_handler)
  • get_logger函数 判断是否输出到文件代码
if self.LOG_ENABLED and self.LOG_TO_FILE:
    log_dir = dirname(self.LOG_PATH)
    if not exists(log_dir): makedirs(log_dir)
    file_handler = logging.FileHandler(self.LOG_PATH, encoding='utf-8')
    file_handler.setLevel(level=self.LOG_LEVEL)
    formatter = logging.Formatter(self.LOG_FORMAT)
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
  • 至此log.py文件就完成了
  • 在创建一个settings.py来存储log的配置选项(此文件可不创建直接在log.py的初始化函数中配置)

  • settings.py中配置代码
# 日志配置
# 是否开启log日志
LOG_ENABLED = os.getenv('LOG_ENABLED', 'True').upper() == 'TRUE'
# 是否输出到控制台
LOG_TO_CONSOLE = os.getenv('LOG_TO_CONSOLE', 'True').upper() == 'TRUE'
# 是否输出到文件
LOG_TO_FILE = os.getenv('LOG_TO_FILE', 'True').upper() == 'TRUE'
# 日志等级
LOG_LEVEL = os.getenv('LOG_LEVEL', 'DEBUG')
# 每条日志输出格式
log_format = '%(levelname)s - %(asctime)s - process: %(process)d - %(filename)s - %(name)s - %(lineno)d - %(module)s - %(message)s'
LOG_FORMAT = os.getenv('LOG_FORMAT', log_format)

# 项目绝对路径
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# 日志存放路径
PATH = os.path.join(BASE_DIR, 'logs')
isExists = os.path.exists(PATH)
# 判断结果
if not isExists:
    # 如果不存在则创建目录
    os.makedirs(PATH)
now_date = datetime.datetime.now().strftime("%Y-%m-%d")
# 日志文件的绝对路径
LOG_PATH = os.path.join(PATH, f'proxy-log-{now_date}.log')

from log import Logger


log = Logger().get_logger()
  • 首先新建一个log.py的文件

  • 导入需要用到的Python包
from settings import log

log.debug('This is a debug message!')

log.error('This is an error message!')
  • 打印信息
DEBUG - 2021-11-24 17:37:37,238 - process: 23652 - test.py - log - 10 - test - This is a debug message!
ERROR - 2021-11-24 17:37:37,238 - process: 23652 - test.py - log - 12 - test - This is an error message!

Process finished with exit code 0

结语

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:https://www.loganjin.cn/article/python-logging/

许可协议:署名-非商业性使用 4.0 国际许可协议