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

在Python项目中统一处理日志

在Python项目中统一处理日志是个很好的实践,有助于调试、监控和问题追踪。下面介绍如何在你的项目中实现统一的日志配置。

1. 日志配置方案

推荐使用logging模块并通过配置文件管理日志设置,这样可以灵活调整日志级别、输出格式和处理方式。

首先在项目中创建logging_config.py文件:

# src/my_package/logging_config.py
import logging
import logging.config
import os
from typing import Dictdef get_logger_config(log_dir: str = None) -> Dict:"""生成日志配置"""# 如果指定了日志目录,确保目录存在if log_dir:os.makedirs(log_dir, exist_ok=True)config = {'version': 1,'disable_existing_loggers': False,'formatters': {'standard': {'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s'},'detailed': {'format': '%(asctime)s - %(name)s - %(levelname)s - %(module)s:%(lineno)d - %(message)s'},},'handlers': {'console': {'class': 'logging.StreamHandler','formatter': 'standard','level': 'INFO','stream': 'ext://sys.stdout',},},'loggers': {'': {  # 根logger'handlers': ['console'],'level': 'INFO','propagate': True,},'my_package': {  # 项目主包的logger'handlers': ['console'],'level': 'DEBUG','propagate': False,},},}# 如果指定了日志目录,添加文件处理器if log_dir:config['handlers']['file'] = {'class': 'logging.handlers.RotatingFileHandler','formatter': 'detailed','level': 'DEBUG','filename': os.path.join(log_dir, 'app.log'),'maxBytes': 10 * 1024 * 1024,  # 10 MB'backupCount': 5,}# 更新logger配置,同时输出到控制台和文件for logger in config['loggers'].values():if 'console' in logger['handlers']:logger['handlers'].append('file')return configdef setup_logging(log_dir: str = None):"""配置并初始化日志系统"""config = get_logger_config(log_dir)logging.config.dictConfig(config)

2. 在主程序中初始化日志

在项目入口文件中初始化日志配置:

# src/my_package/main.py
import os
from .logging_config import setup_logging# 配置日志(可选指定日志文件目录)
log_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../logs')
setup_logging(log_dir)# 获取logger
logger = logging.getLogger(__name__)def main():logger.info("应用启动")# 主程序逻辑logger.debug("执行主程序逻辑")# ...if __name__ == "__main__":main()

3. 在模块中使用日志

在其他模块中直接获取logger即可使用:

# src/my_package/utils.py
import logging# 获取当前模块的logger
logger = logging.getLogger(__name__)def some_function():logger.debug("进入函数 some_function")try:# 函数逻辑logger.info("函数执行成功")except Exception as e:logger.error("函数执行出错: %s", str(e), exc_info=True)

4. 日志配置增强

可以通过环境变量灵活控制日志行为:

# src/my_package/logging_config.py
import osdef get_logger_config():# ... 原有配置代码 ...# 根据环境变量调整日志级别log_level = os.getenv('LOG_LEVEL', 'INFO').upper()config['loggers']['']['level'] = log_levelconfig['loggers']['my_package']['level'] = log_level# ... 其余配置代码 ...

这样可以通过设置环境变量来控制日志级别:

LOG_LEVEL=DEBUG python src/my_package/main.py

5. 日志最佳实践

  1. 使用模块名作为logger名称

    logger = logging.getLogger(__name__)
    
  2. 使用适当的日志级别

    • DEBUG: 详细的调试信息
    • INFO: 确认程序按预期运行
    • WARNING: 潜在问题
    • ERROR: 发生错误但程序仍可继续运行
    • CRITICAL: 严重错误,程序无法继续运行
  3. 结构化日志(可选):
    如果需要更强大的日志分析能力,可以使用structlog库实现结构化日志:

    pip install structlog
    

    配置示例:

    # src/my_package/logging_config.py
    import structlogdef setup_structured_logging():structlog.configure(processors=[structlog.stdlib.add_log_level,structlog.stdlib.PositionalArgumentsFormatter(),structlog.processors.TimeStamper(fmt="iso"),structlog.processors.JSONRenderer(),],logger_factory=structlog.stdlib.LoggerFactory(),)
    

通过以上配置,你的项目将拥有统一的日志系统,便于调试和监控。所有日志格式、存储位置和级别都可以在一个地方集中管理。

http://www.dtcms.com/a/274708.html

相关文章:

  • javaweb之相关jar包和前端包下载。
  • AGX Xavier 搭建360环视教程【一、先确认方案】
  • Kafka——应该选择哪种Kafka?
  • 三种方法批量填充订单表中的空白单元格--python,excel vba,excel
  • 【深度学习新浪潮】图像生成有哪些最新进展?
  • linux-base-end
  • 从《哪吒 2》看个人IP的破局之道|创客匠人
  • NodeJs后端常用三方库汇总
  • css——width: fit-content 宽度、自适应
  • lesson10:Python的元组
  • UI前端与数字孪生结合实践探索:智慧农业的精准灌溉系统
  • FastAPI + SQLAlchemy (异步版)连接数据库时,对数据进行加密
  • C++(STL源码刨析/List)
  • [Meetily后端框架] Whisper转录服务器 | 后端服务管理脚本
  • 如何从0开始构建自己的第一个AI应用?(Prompt工程、Agent自定义、Tuning)
  • MyBatis:SQL与Java的智能桥梁
  • Ant Design ProTable组件深度解析
  • CUDA —— 2.3、cuda静态全局变量__device__使用介绍(附:完整代码)
  • 系统思考:多元胜过能力
  • 计算机网络第三章(5)——数据链路层《广域网》
  • 解锁形状与空间的奥秘:微分几何与流形一瞥-AI云计算拓展核心内容
  • 【C++篇】二叉树进阶(上篇):二叉搜索树
  • 云蝠智能 VoiceAgent重构企业呼入场景服务范式
  • Ubuntu20.04运行openmvg和openmvs实现三维重建(未成功,仅供参考)
  • PyTorch笔记5----------Autograd、nn库
  • 《棒球规则介绍》领队和主教练谁说了算·棒球1号位
  • sqli-labs靶场通关笔记:第1-4关 联合注入
  • ros topic和service的使用
  • 深入浅出Redis:一文掌握Redis底层数据结构与实现原理
  • Java Stream流介绍及使用指南