python日志的使用

一、日志的使用

import logging
# 创建一个记录器对象
logger = logging.getLogger()
# 设置日志级别
logger.setLevel(logging.INFO)
# 设置日志的保存路径
logfile = 'path/data.logs'

# 指定文件处理器,发送日志输出到磁盘文件
fh = logging.FileHandler(logfile, encoding='utf-8')
fh.setLevel(logging.INFO)

# 指定流处理器,发送日志输出
sh = logging.StreamHandler()
sh.setLevel(logging.INFO)

# 创建格式化程序,指定日志的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")

# 给文件文件处理器和流处理器指定格式化成
fh.setFormatter(formatter)
sh.setFormatter(formatter)

# 添加处理程序对象
logger.addHandler(fh)
logger.addHandler(sh)

二、日志的输出格式

%(name)s 记录器的名称
%(levelno)s 数字形式的日志记录级别
%(levelname)s 日志记录级别的文本名称
%(filename)s 执行日志记录调用的源文件的文件名称
%(pathname)s 执行日志记录调用的源文件的路径名称
%(funcName)s 执行日志记录调用的函数名称
%(module)s 执行日志记录调用的模块名称
%(lineno)s 执行日志记录调用的行号
%(created)s 执行日志记录的时间
%(asctime)s 日期和时间
%(msecs)s 毫秒部分
%(thread)d 线程ID
%(threadName)s 线程名称
%(process)d 进程ID
%(message)s 记录的消息

三、自定义日志管理器

class CustomLogger:
    def __init__(self, platform, path_dir, log_name):
        self.log_name = log_name
        self.path_dir = str(path_dir)
        self.platform = platform
        if not os.path.exists(f"./{self.platform}_logs/{self.path_dir}"):
            os.makedirs(f"./{self.platform}_logs/{self.path_dir}", exist_ok=True)
        # 创建一个记录器对象
        _logger = logging.getLogger(self.log_name)
        # 设置日志级别
        _logger.setLevel(logging.INFO)
        # 设置日志的保存路径
        logfile = f'./{self.platform}_logs/{self.path_dir}/{self.log_name}.logs'

        # 指定文件处理器,发送日志输出到磁盘文件
        fh = logging.FileHandler(logfile, encoding='utf-8')
        fh.setLevel(logging.INFO)

        # 指定流处理器,发送日志输出
        sh = logging.StreamHandler()
        sh.setLevel(logging.INFO)

        # 创建格式化程序,指定日志的输出格式
        formatter = logging.Formatter("%(asctime)s 【%(name)s】 \n- %(levelname)s: %(message)s")

        # 给文件文件处理器和流处理器指定格式化成
        fh.setFormatter(formatter)
        sh.setFormatter(formatter)

        # 添加处理程序对象
        _logger.addHandler(fh)
        _logger.addHandler(sh)
        self.get_logger = _logger

    @property
    def info(self):
        return self.get_logger.info

    @property
    def error(self):
        return self.get_logger.error

    @property
    def warning(self):
        return self.get_logger.warning


platform = "主文件夹"
path_dir = "子文件夹"
log_name = "日志记录器对象的名称"
custom_logger = CustomLogger(platform=paltform, path_dir=path_dir, log_name=log_name)
custom_logger.info(f"hello world!!!!!!!!!!!!!{log_name}")

四、logging模块可能会出现的问题

4.1 logging日志重复输出

这种情况一般是发生在自带的longing.info和自己创建的logger.info混合使用的情况,如以下情况:

import logging
# 创建默认的日志管理器root
logger_root = logging.getLogger()
logger_root.setLevel(logging.INFO)
logging.info("logging原生日志")  # 会使用默认的日志管理器root的相关配置去输出日志


# 创建一个记录器对象
logger = logging.getLogger("my_logger")
# 设置日志级别
logger.setLevel(logging.INFO)
# 指定流处理器,发送日志输出
sh = logging.StreamHandler()
sh.setLevel(logging.INFO)
# 创建格式化程序,指定日志的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
# 给文件文件处理器和流处理器指定格式化成
sh.setFormatter(formatter)
# 添加处理程序对象
logger.addHandler(sh)

# 当使用logging.info去输出日志时,再创建一个新的非root日志管理器去输出日志,会以该新创建的日志管理器的名称去输出一条日志,即重复日志
logger.info("hello")  # 会输出两条日志

执行结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值