python(41) : 日志管理

1.安装依赖

pip install loguru 

2.log_config.py

from loguru import logger
import os
from datetime import datetime, timedelta


def setup_rotating_logger():
    log_dir = "logs"
    os.makedirs(log_dir, exist_ok=True)
    
    # 从环境变量获取控制台日志级别,默认为INFO
    console_log_level = os.getenv("CONSOLE_LOG_LEVEL", "INFO").upper()
    valid_levels = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
    if console_log_level not in valid_levels:
        console_log_level = "INFO"  # 如果环境变量值无效,使用默认值

    # 固定日志文件名
    current_log = os.path.join(log_dir, "app.log")
    # 错误日志固定文件名
    error_log = os.path.join(log_dir, "error.log")
    # 历史日志文件名格式
    history_pattern = os.path.join(log_dir, "app_{}.log")
    error_history_pattern = os.path.join(log_dir, "error_{}.log")

    # 移除默认输出
    logger.remove()

    # 自定义处理常规日志的sink(含每日归档)
    def rotating_sink(message):
        now = datetime.now()
        yesterday = now - timedelta(days=1)
        yesterday_str = yesterday.strftime("%Y%m%d")

        # 处理常规日志归档
        if os.path.exists(current_log):
            file_mtime = datetime.fromtimestamp(os.path.getmtime(current_log))
            if file_mtime.date() == yesterday.date():
                history_log = history_pattern.format(yesterday_str)
                if not os.path.exists(history_log):
                    os.rename(current_log, history_log)
                    # 移除logger调用以避免死锁,改为直接打印到控制台
                    print(f"常规日志已归档至: {history_log}")

        # 写入当前常规日志
        with open(current_log, "a", encoding="utf-8") as f:
            f.write(message)

    # 自定义处理错误日志的sink(含每日归档)
    def error_rotating_sink(message):
        now = datetime.now()
        yesterday = now - timedelta(days=1)
        yesterday_str = yesterday.strftime("%Y%m%d")

        # 处理错误日志归档
        if os.path.exists(error_log):
            file_mtime = datetime.fromtimestamp(os.path.getmtime(error_log))
            if file_mtime.date() == yesterday.date():
                history_error_log = error_history_pattern.format(yesterday_str)
                if not os.path.exists(history_error_log):
                    os.rename(error_log, history_error_log)
                    # 移除logger调用以避免死锁,改为直接打印到控制台
                    print(f"错误日志已归档至: {history_error_log}")

        # 写入当前错误日志
        with open(error_log, "a", encoding="utf-8") as f:
            f.write(message)

    # 1. 控制台输出(根据环境变量设置级别)
    logger.add(
        sink=lambda msg: print(msg, end=""),
        format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{module}</cyan>:<cyan>{line}</cyan> | <magenta>PID:{process}</magenta> - <level>{message}</level>",
        level=console_log_level
    )

    # 输出当前控制台日志级别设置
    print(f"控制台日志级别设置为: {console_log_level}")

    # 2. 常规日志文件(所有级别,每日归档)
    logger.add(
        sink=rotating_sink,
        format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {module}:{line} | PID:{process} - {message}\n",
        level="DEBUG"
    )

    # 3. 错误日志文件(仅ERROR及以上级别,每日归档)
    logger.add(
        sink=error_rotating_sink,
        format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {module}:{line} | PID:{process} - {message}\n",
        level="ERROR"  # 只处理ERROR及更高级别
    )

    return logger


# 初始化日志
logger = setup_rotating_logger()

# 测试代码
if __name__ == "__main__":
    logger.info("程序启动,这是普通信息日志")
    logger.debug("这是调试日志,不会出现在error.log")
    logger.warning("这是警告日志,也不会出现在error.log")

    try:
        1 / 0
    except ZeroDivisionError:
        logger.error("发生除零错误")  # 会写入error.log
        logger.exception("详细异常堆栈")  # 也会写入error.log

3.其他py文件引用

from log_config import logger


logger.info('111, {}', 2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值