• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Python日志模块Logging使用指北(最新推荐)

    发布者: Error | 发布时间: 2025-6-14 12:23| 查看数: 108| 评论数: 0|帖子模式

    1. Logging
    复制代码
    模块是
    1. Python
    复制代码
    中一个很重要的日志模块,它提供了灵活的日志记录功能,广泛应用于调试、运行状态监控、错误追踪以及系统运维中。相比于简单的
    1. print()
    复制代码
    打印调试,
    1. Logging
    复制代码
    支持不同的日志级别(如
    1. DEBUG
    复制代码
    1. INFO
    复制代码
    1. WARNING
    复制代码
    1. ERROR
    复制代码
    1. CRITICAL
    复制代码
    ),可将日志输出到不同位置(如控制台、文件、网络等),还能自定义日志格式和处理方式,从而更好地满足实际项目中的日志管理需求。
            相信各位小伙伴在平时比赛或者项目中写Python代码的时候,肯定会遇到代码出现莫名其妙的报错,而我们一时半会无法快速定位到问题出在哪里。这时候,相信很多同学都会使用
    1. print()
    复制代码
    函数在代码的不同地方插入打印输出来不断调试、缩小问题范围。虽然这种方式简单粗暴,在小项目或调试时确实能派上用场,但随着项目复杂度的提高,
    1. print()
    复制代码
    调试法就显得力不从心了。比如,你可能想区分调试信息和错误信息,或者只在生产环境中输出关键日志,还可能需要将日志写入文件供后续分析抑或是在找到问题之后还需手动删除各处的调试
    1. print()
    复制代码
    函数,这不仅麻烦,而且很容易遗漏,甚至可能将调试信息带到线上环境,造成信息泄露或日志污染。
            因此,学会使用专业的日志工具显得尤为重要。在Python中,
    1. logging
    复制代码
    模块正是官方推荐用于记录日志的强大工具。它不仅支持不同的日志等级(如
    1. DEBUG
    复制代码
    1. INFO
    复制代码
    1. WARNING
    复制代码
    1. ERROR
    复制代码
    1. CRITICAL
    复制代码
    ),还允许我们将日志灵活地输出到控制台、文件,甚至远程服务器。此外,
    1. logging
    复制代码
    还支持自定义日志格式和多种处理器组合,能很好地适配各种复杂应用场景。接下来,我们就从最基础的用法入手,带你一步步掌握
    1. logging
    复制代码
    模块的强大功能,写出更专业、更易维护的Python代码!!!
            首先我们要知道,在
    1. Logging
    复制代码
    模块中日志根据作用以及重要程度从小到大依次被分为了如下五个等级,具体如下表:
    日志等级(level)描述DEBUG调试信息,通常在诊断问题的时候使用INFO普通信息,确认程序按照预期运行WARNING警告信息,表示发生意想不到的事,或者指示接下来可能会出现一些问题,但是程序还是继续运行ERROR错误信息,程序运行中出现了一些问题,程序某些功能可能不能执行CRITICAL危险信息,一个严重的错误,导致程序无法继续运行        知道了这些,那我们具体该如何在代码中实现日志管理呢?我们接着往下讲,首先我们肯定是要在代码中导入我们的
    1. logging
    复制代码
    模块,这个模块是Python内置的,无需额外安装,接着我们要引入
    1. logging
    复制代码
    模块中的
    1. basicConfig
    复制代码
    函数,这个是配置日志系统最常用、最简单的一种方式,我们可以通过它来设置最低显示的日志等级、日志的显示格式、日志输出位置(默认是终端)以及写入文件的文件名和编码,接着我们结合示例来给大家演示一下:

    • 最低显示的日志等级:
            从下面的代码中我们可以看到,我们可以使用
    1. level
    复制代码
    参数来设置日志的最低显示的等级,而当我们在
    1. basicConfig
    复制代码
    中将最低显示的日志等级
    1. level
    复制代码
    设置为
    1. WARNING
    复制代码
    的时候,只有大于
    1. WARNING
    复制代码
    的消息才会被显示出来
    1. import logging
    2. logging.basicConfig(
    3.     level=logging.WARNING,
    4. )
    5. logging.debug("This is a debug message")
    6. logging.info("This is an info message")
    7. logging.warning("This is a warning message")
    8. logging.error("This is an error message")
    9. logging.critical("This is a critical message")
    复制代码


    • 日志的显示格式:
            除了设置最低显示的日志等级之外,我们还可以使用
    1. format
    复制代码
    参数来对我们的日志显示格式进行设置,
    1. format
    复制代码
    有很多可供选择的占位符,具体的见下表:
    format占位符含义说明
    1. %(asctime)s
    复制代码
    日志事件发生的时间(默认格式可自定义)
    1. %(levelname)s
    复制代码
    日志级别名称(如 INFO、DEBUG 等)
    1. %(message)s
    复制代码
    日志内容主体(你传入的日志消息)
    1. %(name)s
    复制代码
    日志器的名称(Logger对象的名字)
    1. %(filename)s
    复制代码
    当前执行代码的文件名
    1. %(funcName)s
    复制代码
    调用日志输出函数的函数名
    1. %(lineno)d
    复制代码
    输出日志的代码行号
    1. %(pathname)s
    复制代码
    当前执行代码的完整路径
    1. %(module)s
    复制代码
    模块名
    1. %(threadName)s
    复制代码
    线程名称(在多线程应用中常用)
    1. %(process)d
    复制代码
    进程 ID(在多进程应用中常用)
    1. import logging
    2. logging.basicConfig(
    3.     level=logging.WARNING,
    4.     format="时间:%(asctime)s-日志名称:%(name)s-日志级别:%(levelname)s-日志信息:%(message)s-文件名:%(filename)s-行号:%(lineno)d"
    5. )
    6. logging.debug("This is a debug message")
    7. logging.info("This is an info message")
    8. logging.warning("This is a warning message")
    9. logging.error("This is an error message")
    10. logging.critical("This is a critical message")
    复制代码


    • 日志输出位置:
            除了将日志信息打印到终端(默认行为)以外,我们还可以通过
    1. filename
    复制代码
    参数将日志写入到指定的文件中。这样一来,我们就可以保存程序运行过程中的所有重要信息,便于后续排查问题或对系统进行日志分析。 我们还可以指定文件的编码方式,比如使用
    1. utf-8
    复制代码
    ,以避免中文乱码等问题。下面我们通过一个示例将日志写入文件中:
    1. import logging
    2. logging.basicConfig(
    3.     level=logging.WARNING,
    4.     format = '[%(name)s] [%(asctime)s.%(msecs)03d] [%(levelname)s] %(message)s',
    5.     filename='my_log.log',
    6.     encoding="utf-8"
    7. )
    8. logging.debug("This is a debug message")
    9. logging.info("This is an info message")
    10. logging.warning("This is a warning message")
    11. logging.error("This is an error message")
    12. logging.critical("This is a critical message")
    复制代码
           可以看到,运行了这段代码之后终端没有输出了,而在同路径下生成了一个我们指定的
    1. my_log.log
    复制代码
    文件,这个文件里就有我们需要的日志输出


            如果想每次运行都重新生成日志文件,我们可以继续加上
    1. filemode='w'
    复制代码
    参数
    1. import logging
    2. logging.basicConfig(
    3.     level=logging.WARNING,
    4.     format = '[%(name)s] [%(asctime)s.%(msecs)03d] [%(levelname)s] %(message)s',
    5.     filename='my_log.log',
    6.     encoding="utf-8",
    7.     filemode='w'
    8. )
    9. logging.debug("This is a debug message")
    10. logging.info("This is an info message")
    11. logging.warning("This is a warning message")
    12. logging.error("This is an error message")
    13. logging.critical("This is a critical message")
    复制代码
           除此之外,我们也可以给当前的日志信息“命个名”,这在大型项目中非常有用!只需要通过
    1. logging.getLogger("名字")
    复制代码
    来创建一个具名 Logger,你可以根据模块、功能、组件的不同给它们起不同的名字,这样日志输出的时候就能快速定位日志是从哪个部分打印出来的,非常适合团队协作和大型工程的调试分析。
    1. import logging
    2. logging.basicConfig(
    3.     level=logging.WARNING,
    4.     format = '[%(name)s] [%(asctime)s.%(msecs)03d] [%(levelname)s] %(message)s',
    5. )
    6. logger = logging.getLogger("example")
    7. logger.debug("This is a debug message")
    8. logger.info("This is an info message")
    9. logger.warning("This is a warning message")
    10. logger.error("This is an error message")
    11. logger.critical("This is a critical message")
    复制代码

            但是有同学就要问了:“哥们哥们,如果我既想让日志在终端显示,又想把日志写进文件保存下来,该怎么办呢?”这个问题非常常见!实际上,
    1. basicConfig
    复制代码
    方式虽然简单方便,但它本质上是对根日志器(root logger)做一次性配置的,不支持同时配置多个输出目标(Handler)。也就是说,如果你想实现“同时输出到终端和文件”,就需要用更灵活的方式——自定义 Logger + Handler + Formatter 的组合配置
            
    1. Handler 
    复制代码
    是什么呢?
    1. Handler 
    复制代码
    1. logging
    复制代码
    模块中的一个核心概念,它负责将日志消息输出到指定的目标,如控制台、文件、网络等。而 Formatter 则负责定义输出日志的格式。通过组合
    1. Logger
    复制代码
    1. Handler
    复制代码
    1. Formatter
    复制代码
    ,我们能够更加灵活地控制日志的输出方式和格式。我们可以用下图来进行理解

            具体的示例如下,我们首先创建一个
    1. logger
    复制代码
    对象,并通过
    1. getLogger
    复制代码
    方法为其指定一个名称(在这里是
    1. "example_logger"
    复制代码
    )。接着,我们使用
    1. setLevel
    复制代码
    方法设置日志的最低输出级别为
    1. DEBUG
    复制代码
    ,这样所有级别(包括
    1. DEBUG
    复制代码
    1. INFO
    复制代码
    1. WARNING
    复制代码
    1. ERROR
    复制代码
    1. CRITICAL
    复制代码
    )的日志都能被处理。然后,我们创建了两个
    1. Handler
    复制代码
    :一个是
    1. StreamHandler
    复制代码
    ,用于将日志输出到控制台;另一个是
    1. FileHandler
    复制代码
    ,用于将日志写入名为
    1. logfile.log
    复制代码
    的文件。接着,我们使用
    1. Formatter
    复制代码
    设置日志输出的格式,包括日志器名称、日志时间、日志级别和日志信息,最后将这个
    1. Formatter
    复制代码
    配置应用到两个
    1. Handler
    复制代码
    上。最后,通过
    1. addHandler
    复制代码
    方法将这两个
    1. Handler
    复制代码
    添加到
    1. logger
    复制代码
    中,这样我们就能实现同时将日志输出到控制台和文件。
    1. import logging
    2. logger = logging.getLogger("example_logger")
    3. logger.setLevel(logging.DEBUG)  
    4. # 创建两个Handler,分别输出到控制台和文件
    5. console_handler = logging.StreamHandler()  # 输出到控制台
    6. file_handler = logging.FileHandler("logfile.log", encoding="utf-8")  # 输出到文件
    7. # 创建Formatter并设置格式
    8. formatter = logging.Formatter(
    9.     '[%(name)s] [%(asctime)s] [%(levelname)s] %(message)s'
    10. )
    11. console_handler.setFormatter(formatter)  # 控制台Handler设置Formatter
    12. file_handler.setFormatter(formatter)  # 文件Handler设置Formatter
    13. # 将Handler添加到Logger中
    14. logger.addHandler(console_handler)
    15. logger.addHandler(file_handler)
    16. logger.debug("This is a debug message")
    17. logger.info("This is an info message")
    18. logger.warning("This is a warning message")
    19. logger.error("This is an error message")
    20. logger.critical("This is a critical message")
    复制代码
           我们运行下这段代码可以发现不仅终端有输出,我们的日志文件里面也有记录:


    到此这篇关于Python日志模块Logging使用指北的文章就介绍到这了,更多相关Python日志模块Logging内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/python/339999deh.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表