Python内置日志模块logging

23次阅读
没有评论

共计 2562 个字符,预计需要花费 7 分钟才能阅读完成。

logging 模块主要是为了记录程序运行期间产生的日志信息。

日志输出级别

有 5 个(10、20、30、40、50):
debug: 代码调试时输出的日志信息
info: 代码正常运行过程中输出的日志信息
warning: 代码运行结果可能和预期结果发生偏差时输出的日志信息
error: 代码出现异常时输出的日志信息
critical(fatal): 一般遇不到,遇到了也解决不了的问题,例如:磁盘或者内存空间已满等

logging 默认设置是 warning 级别,可以设置日志输出级别:

import logging
# 构造 logger 对象
logger = logging.getLogger()
# 构造 stream_handler,得到一个将日志输出到控制台的 Handler 对象
stream_handler = logging.StreamHandler()
# logger 对象添加 stream_handler
logger.addHandler(stream_handler)
# 设置日志输出级别
logger.setLevel(logging.INFO)
# 使用 logger
logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')

日志输出格式

# 设置日志输出格式
fmt = logging.Formatter('%(asctime)s - [%(levelname)s] - %(filename)s[%(lineno)d]: %(message)s')
stream_handler.setFormatter(fmt)

日志输出到文件

import logging

logger = logging.getLogger()

file_handler = logging.FileHandler('./test.log', encoding='utf-8')  # 构造 file_handler
fmt = logging.Formatter('%(asctime)s - [%(levelname)s] - %(filename)s[%(lineno)d]: %(message)s')
file_handler.setFormatter(fmt)

logger.addHandler(file_handler)
logger.setLevel(logging.INFO)

logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')

封装 logging 工具

import logging

class Logging:
    def __init__(self, level=20):
        self.logger = logging.getLogger()
        self.logger.setLevel(level)

def init_logger():
    logger = Logging().logger
    stream_handler = logging.StreamHandler()
    file_handler = logging.FileHandler('./test.log', encoding='utf-8')
    fmt = logging.Formatter('%(asctime)s - [%(levelname)s] - %(filename)s[%(lineno)d]: %(message)s')
    stream_handler.setFormatter(fmt)
    file_handler.setFormatter(fmt)

    logger.addHandler(stream_handler)
    logger.addHandler(file_handler)

    return logger

代码重构

可进一步对 logging 工具进行代码优化:
[ppblock ex=” 请输入密码 ”]
config/project_config.py

import time

# 日志存储路径
log_root_path = './logs/'

log_fname = log_root_path + \
    f"pyetl-{time.strftime('%Y%m%d-%H',time.localtime(time.time()))}.log"

log_level = 20

util/logging_util.py

"""
这个文件的功能,是构建日志输出模块
方便后续快速的在程序中输出日志信息
"""
import logging
from config.project_config import log_fname, log_level

class Logging:
    def __init__(self, level=20):
        self.logger = logging.getLogger()
        self.logger.setLevel(level)

def init_logger():
    logger = Logging(log_level).logger

    # 避免重复输出日志
    if logger.handlers:
        return logger

    stream_handler = logging.StreamHandler()
    file_handler = logging.FileHandler(log_fname, encoding='utf-8')
    fmt = logging.Formatter('%(asctime)s - [%(levelname)s] - %(filename)s[%(lineno)d]: %(message)s')
    stream_handler.setFormatter(fmt)
    file_handler.setFormatter(fmt)

    logger.addHandler(stream_handler)
    logger.addHandler(file_handler)

    return logger

main.py

from util.logging_util import init_logger

logger = init_logger()

logger.info('测试 info')

[/ppblock]

正文完
post-qrcode
 0
三毛
版权声明:本站原创文章,由 三毛 于2023-11-01发表,共计2562字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)