当前位置: 首页 > news >正文

python load_dotenv find_dotenv loguru

load_dotenv

find_dotenv

loguru

config.py必须在项目启动时最先被导入,否则其他模块先from loguru import logger使用时,默认 handler 还没被移除,就会出现重复打印。

from dotenv import load_dotenv, find_dotenv import os from loguru import logger import sys """ override 是否覆盖已有系统环境变量 默认 False:系统已存在同名环境变量,.env 中的值不会覆盖 True:强制用 .env 内的值覆盖系统现有环境变量 verbose 日志警告开关 True:如果找不到 .env 文件,控制台输出警告日志 False:文件不存在时静默无提示 """ load_dotenv(find_dotenv(), override=True, verbose=True) """日志文件""" _log_dir = os.path.join(os.path.dirname(__file__), "logs") os.makedirs(_log_dir, exist_ok=True) """# 【关键】先移除默认handler,然后重新添加一个排除progress_tracking的handler""" """# 移除所有默认handler""" logger.remove() """(1)日志输出到控制台""" logger.add( sys.stderr, format="<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>", level="INFO", colorize=True ) """(2)日志输出到日志文件""" logger.add( os.path.join(_log_dir, "logs_{time:YYYY-MM-DD}.log"), level="INFO", # 只记录 INFO 及以上级别(INFO / WARNING / ERROR),DEBUG 不记录 format="<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>", rotation="00:00", # 日志轮转:每天零点自动切新文件,旧文件重命名归档 retention="7 days", # 保留策略:只保留最近 7 天的日志,超期自动删除 compression="zip", # 轮转后的旧日志自动压缩为 .zip,节省磁盘 enqueue=True, # 异步写入:日志先入队列,后台线程批量写文件,避免阻塞主业务 backtrace=True, # 异常时打印完整调用链(loguru 特性,比 Python 默认的 traceback 更详细) diagnose=True, # 异常时显示局部变量值,方便排查问题 ) """(3)错误日志输出到日志文件""" logger.add( os.path.join(_log_dir, "error_{time:YYYY-MM-DD}.log"), level="ERROR", # 只记录 INFO 及以上级别(INFO / WARNING / ERROR),DEBUG 不记录 format="<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>", rotation="00:00", # 日志轮转:每天零点自动切新文件,旧文件重命名归档 retention="7 days", # 保留策略:只保留最近 7 天的日志,超期自动删除 compression="zip", # 轮转后的旧日志自动压缩为 .zip,节省磁盘 enqueue=True, # 异步写入:日志先入队列,后台线程批量写文件,避免阻塞主业务 backtrace=True, # 异常时打印完整调用链(loguru 特性,比 Python 默认的 traceback 更详细) diagnose=True, # 异常时显示局部变量值,方便排查问题 ) API_TEST_KEY = os.getenv("API_TEST_KEY") logger.debug("param:{}", API_TEST_KEY) logger.info("param:{}", API_TEST_KEY) logger.warning("param:{}", API_TEST_KEY) logger.error("param:{}", API_TEST_KEY)

如何保证config.py被优先导入

# main.py — 第一行就导入 config import config # ✅ 最先执行,完成 logger 初始化 from fastapi import FastAPI from loguru import logger # 此时 logger 已经配好 app = FastAPI() @app.get("/") async def root(): logger.info("请求来了") # 直接使用配置好的 logger return {"ok": True}
.env文件 API_TEST_KEY=skxwq0123jr123021903
http://www.jsqmd.com/news/1291062/

相关文章:

  • lvs项目中的所有知识点总结
  • SpringBoot+Vue构建超市管理系统的架构设计与实践
  • 多账号运营怎么选IP才能避免被平台检测到关联?实测干货指引
  • League Akari助手:英雄联盟玩家的终极效率工具指南
  • GPT 5.6场景自适应能力解析:从技术原理到工作流集成实战
  • 2026这6款硬核降AI率平台大起底,一键让AIGC率直逼绝对安全线!
  • 告别机翻病句[特殊字符]OKBIYE学术外文翻译才是论文刚需神器
  • 2026年高纯特种单体丙烯酸异丁酯(IBA)市场供需与国产替代技术白皮书
  • 答辩PPT救星✨10分钟搞定学术汇报!AI一键出片太绝了
  • 运维转大模型:把方案拆到可执行
  • 为什么GPT-4 Turbo仍需人工干预第2步?揭秘头部AI团队正在封测的分步执行自校验协议(限内测白名单)
  • LangGraph框架:构建高效AI Agent系统的核心技术解析
  • Unity VFX Graph核心技巧:从节点操作到GPU特效优化实战
  • Bebas Neue:当几何美学遇见开源自由——一个字体设计的革命性实验
  • Agent 设计模式终极整合:六大模式合一,一套 Java 框架从开发到生产部署
  • 基于OSM路网与ArcGIS Pro的交通分析小区自动化生成方法
  • 如果 iPhone 丢失或被盗,如何远程擦除 iPhone?
  • 35B大模型16GB显存部署对比:Ornith与Qwen实测指南
  • 别再用普通翻译写论文[特殊字符]OKBIYE学术翻译才是正确打开方式
  • 告别论文内耗✨一个OKBIYE搞定毕业全流程
  • ESP-IDF保姆级入门06|I2C通信详解 + 0.96寸OLED屏幕驱动实战:显示文字_数字_动态数据(零基础可复现)
  • AI合同模板生成实战手册:从零搭建企业级智能合同工厂,7天上线交付
  • 渗透测试效率倍增器:2026年十大必备安全工具深度评测与进阶用法(附一键安装脚本)
  • 电子系统设计实战:从硬件到Windows客户端软件开发全流程解析
  • PyTorch深度学习入门:从张量、自动微分到完整训练流程实战
  • Python位运算实战:左移右移核心原理与高效应用
  • AI 与 BI 的融合路径:传统看板被自然语言查询取代还要多久
  • RAG与Agentic RAG技术对比与应用指南
  • 3步解锁英雄联盟极致体验:League Akari的智能本地化解决方案
  • 计算机保研夏令营申请策略:从海投到精准投递的实战复盘