python日志模块loguru使用

2021/10/01 python loguru 共 2733 字,约 8 分钟

loguru模块是python日志记录和输出的第三方库,相比python自带的logging需要自定义日志的格式,输出文件等。loguru使用则更加方便,简洁。

安装

pip install loguru

使用

1.输出日志到控制台

这里日志的输出自带默认的时间格式

from loguru import logger
logger.info("this is info log")

2.日志输出到文件

from loguru import logger
logger.add("file.log")
logger.info("this is info log")

3.日志rotation / retention / compression

logger.add("file_1.log", rotation="500 MB")    # 文件超过500MB则新生成一个文件
logger.add("file_2.log", rotation="00:00")     # 每天0点新生成一个文件
logger.add("file_X.log", retention="10 days")  # 保留10天的日志文件
logger.add("file_Y.log", compression="zip")    # 如果不想删除原有日志文件,loguru可以将日志直接压缩

日志模块封装

这里直接给一个将loguru封装后的工具,可以放在项目公共部分的utils目录下,提供其他模块调用

import os
import sys

import loguru


class Logger:
    """more config params
    level="ERROR",
    format="{time:HH:mm:ss} {message}",
    retention='10 days',  # 设置历史保留时长 分时间'10 days' 分文件个数
    rotation="5kb",  # 切割,设置文件大小,rotation="12:00",rotation="1 week"
    filter="my_module"  # 过滤模块
    compression="zip",  # 文件压缩
    serialize = True
    backtrace=True,  # 回溯
    diagnose=True,  # 诊断
    enqueue=True,  # 异步写入
    """
    __instance = None

    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance = super(Logger, cls).__new__(cls, *args, **kwargs)
        return cls.__instance

    def __init__(self, name=None):
        if not os.path.isdir(self.log_path):
            os.makedirs(self.log_path)
        if name is None:
            self.name = __name__
        self.logger_add()

    base_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
    log_path = os.path.join(base_path, 'logs')

    info_file = os.path.join(log_path, 'info.log')
    warning_file = os.path.join(log_path, 'warning.log')
    error_file = os.path.join(log_path, 'error.log')
    critical_file = os.path.join(log_path, 'critical.log')

    def logger_add(self):
        config = {
            "handlers": [
                {
                    "sink": sys.stdout,
                    'level': 'DEBUG',
                    "format": "<green>[{time:YYYY-MM-DD HH:mm:ss}]</green>|{extra[name]}|{level}|{file}:{module}:{line}:<level>{message}</level>",
                },

                {
                    "sink": self.info_file,
                    'level': 'INFO',
                    'filter': lambda x: 'INFO' in str(x['level']).upper(),
                    'retention': 5,
                    'rotation': '1 hours',
                    "format": "[{time:YYYY-MM-DD HH:mm:ss}]|{extra[name]}|{level}|{file}:{module}:{line}:{message}"},

                {
                    "sink": self.warning_file,
                    'level': 'WARNING',
                    'filter': lambda x: 'WARNING' in str(x['level']).upper(),
                    'retention': 5,
                    'rotation': '1kb',
                    "format": "[{time:YYYY-MM-DD HH:mm:ss}]|{extra[name]}|{level}|{file}:{module}:{line}:{message}",
                },

                {
                    "sink": self.error_file,
                    'level': 'ERROR',
                    'filter': lambda x: 'ERROR' in str(x['level']).upper(),
                    'retention': 5,
                    'rotation': '1kb',
                    "format": "[{time:YYYY-MM-DD HH:mm:ss}]|{extra[name]}|{level}|{file}:{module}:{line}:{message}",
                },

                {
                    "sink": self.critical_file,
                    'level': 'CRITICAL',
                    'filter': lambda x: 'CRITICAL' in str(x['level']).upper(),
                    'retention': 5,
                    'rotation': '1kb',
                    "format": "[{time:YYYY-MM-DD HH:mm:ss}]|{extra[name]}|{level}|{file}:{module}:{line}:{message}",
                },
            ],
            "extra": {"name": self.name}
        }
        loguru.logger.configure(**config)

    @property
    def get_logger(self):
        return loguru.logger


logger = Logger().get_logger

搜索

    内容