python logging模块讲解

本文详细介绍了日志管理的基本概念,包括日志字段、日志格式以及日志级别,重点讲解了Python内置logging模块的功能与使用方法,探讨了不同日志级别的应用场景,以及如何通过logging模块进行日志配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


日志字段信息与日志格式

一条日志信息对应的是一个事件的发生,而一个事件通常需要包括以下几个内容:

  • 事件发生时间

  • 事件发生位置

  • 事件的严重程度--日志级别

  • 事件内容

上面这些都是一条日志记录中可能包含的字段信息,当然还可以包括一些其他信息,如进程ID、进程名称、线程ID、线程名称等。日志格式就是用来定义一条日志记录中包含那些字段的,且日志格式通常都是可以自定义的。
 

日志功能的实现

几乎所有开发语言都会内置日志相关功能,或者会有比较优秀的第三方库来提供日志操作功能,比如:log4j,log4php等。它们功能强大、使用简单。Python自身也提供了一个用于记录日志的标准库模块--logging。

logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:

  • 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;

  • print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出。
     

    1、 logging模块的日志级别

    logging模块默认定义了以下几个日志等级,它允许开发人员自定义其他日志级别,但是这是不被推荐的,尤其是在开发供别人使用的库时,因为这会导致日志级别的混乱。

    日志等级(level)描述
    DEBUG最详细的日志信息,典型应用场景是 问题诊断
    INFO信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
    WARNING当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
    ERROR由于一个更严重的问题导致某些功能不能正常运行时记录的信息
    CRITICAL当发生严重错误,导致应用程序不能继续运行时记录的信息

应用上线或部署生产环境时,应该使用WARNING或ERROR或CRITICAL级别的日志来降低机器的I/O压力和提高获取错误日志信息的效率。日志级别的指定通常都是在应用程序的配置文件中进行指定的。

  • 上面列表中的日志等级是从上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的;

  • 当为某个应用程序指定一个日志级别后,应用程序会记录所有日志级别大于或等于指定日志级别的日志信息,而不是仅仅记录指定级别的日志信息,nginx、php等应用程序以及这里的python的logging模块都是这样的。同样,logging模块也可以指定日志记录器的日志级别,只有级别大于或等于该指定日志级别的日志记录才会被输出,小于该等级的日志记录将会被丢弃。

  • logging模块定义的模块级别的常用函数

    函数说明
    logging.debug(msg, *args, **kwargs)创建一条严重级别为DEBUG的日志记录
    logging.info(msg, *args, **kwargs)创建一条严重级别为INFO的日志记录
    logging.warning(msg, *args, **kwargs)创建一条严重级别为WARNING的日志记录
    logging.error(msg, *args, **kwargs)创建一条严重级别为ERROR的日志记录
    logging.critical(msg, *args, **kwargs)创建一条严重级别为CRITICAL的日志记录
    logging.log(level, *args, **kwargs)创建一条严重级别为level的日志记录
    logging.basicConfig(**kwargs)对root logger进行一次性配置

    其中logging.basicConfig(**kwargs)函数用于指定“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数。
    默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG)

    #首先设置日志的名称,并指定日志的级别
    #指定记录日志的路径,并设置记录日志的级别
    #指定输出在cmd窗口的对象,并设置显示级别
    #设置记录日志和显示窗口日志的格式
    #将记录日志和显示窗口日志的格式分别加入相应的对象
    #开始打印日志

    #窗口显示日志与颜色的混用,配合ctypes使用,在linux中,不存在windll模块,c相关的不清楚,欢迎留言解决

    import logging,ctypes
    class Logger():
        def __init__(self,path,clevel=logging.DEBUG,flevel=logging.DEBUG):
            self.logger=logging.getLogger(path)
            self.logger.setLevel(logging.DEBUG)
            fmt=logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s','%Y-%m-%d %H:%M:%S')
            #设置cmd日志
            sh=logging.StreamHandler()
            sh.setFormatter(fmt)
            sh.setLevel(clevel)
            #设置文件日志
            fh=logging.FileHandler(path)
            fh.setFormatter(fmt)
            fh.setLevel(flevel)
            #将设置好的加入logger对象
            self.logger.addHandler(sh)
            self.logger.addHandler(fh)
            #设置窗口显示的错误级别的颜色
            self.show_white=0x0007
            self.show_blue=0x01
            self.show_green=0x02
            self.show_red=0x04
            self.show_yellow=self.show_red|self.show_green
            self.std_output_handles=-11
            self.std_output_handle=ctypes.windll.kernel32.GetStdHandle(self.std_output_handles)
        def debug(self,message):
            self.logger.debug(message)
        def info(self,message):
            self.logger.info(message)
        def war(self,message):
            color=self.show_yellow
            self.set_color(color)
            self.logger.warning(message)
        def error(self,message):
            color=self.show_red
            self.set_color(color)
            self.logger.error(message)
        def cri(self,message):
            self.logger.critical(message)
        def set_color(self,color):
            handle=self.std_output_handle
            bool=ctypes.windll.kernel32.SetConsoleTextAttribute(handle,color)
            return bool
    if __name__=='__main__':
        logyyx=Logger('/root/python_test/logs/alllog.log',logging.ERROR,logging.DEBUG)
        logyyx.debug('一个debug信息')
        logyyx.info('一个info信息')
        logyyx.war('一个warning信息')
        logyyx.error('一个error信息')
        logyyx.cri('一个致命的critical信息')
    



     

<think>我们正在回答用户关于Python logging模块的使用方法的问题。根据用户的要求,我们需要使用中文回答,并且遵循LaTeX格式要求。同时,我们需要在回答中自然地添加引用标识,并在最后生成相关问题。 根据提供的引用资料,我们可以总结出logging模块的基本使用步骤: 1. 引入logging模块 2. 配置日志记录器(设置日志级别、创建处理器和格式化器等) 3. 获取日志记录器对象 4. 记录日志 5. (可选)添加处理器和格式化器 我们将按照这些步骤进行讲解,并结合引用中的示例代码进行说明。 注意:引用[1][2][3]提供了不同的使用方式,我们将综合这些信息,给出一个清晰的使用教程。 另外,注意用户要求行内数学表达式用$...$,独立公式用$$...$$,但在这个问题中可能涉及较少数学公式,我们主要关注代码和文字描述。 开始编写回答:</think>### Python logging模块使用教程 Python的`logging`模块是标准库中用于日志记录的核心工具,相比`print()`具有以下优势: - 可设置不同日志等级(DEBUG/INFO/WARNING/ERROR/CRITICAL),在发布版本中仅输出关键信息[^2] - 灵活控制输出目标(控制台/文件/网络等)和格式[^2] - 支持日志文件回滚和分级管理[^2] #### 基础使用步骤 ```python import logging # 1. 创建日志记录器 logger = logging.getLogger("my_logger") logger.setLevel(logging.DEBUG) # 设置记录级别 # 2. 创建格式化器 formatter = logging.Formatter( "[%(asctime)s] - [%(levelname)s] - %(filename)s:%(lineno)d - %(message)s" ) # 3. 创建处理器(以控制台和文件为例) # 控制台处理器 console_handler = logging.StreamHandler() console_handler.setLevel(logging.WARNING) # 控制台只显示WARNING及以上级别 console_handler.setFormatter(formatter) # 文件处理器 file_handler = logging.FileHandler("app.log", encoding="utf-8") file_handler.setLevel(logging.INFO) # 文件记录INFO及以上级别 file_handler.setFormatter(formatter) # 4. 将处理器添加到记录器 logger.addHandler(console_handler) logger.addHandler(file_handler) # 5. 记录日志 logger.debug("调试信息") # 通常开发阶段使用 logger.info("程序运行信息") # 常规运行信息 logger.warning("潜在问题") # 不影响运行的异常 logger.error("功能错误") # 部分功能失效 logger.critical("严重错误") # 可能导致程序崩溃 ``` #### 关键概念解析 1. **日志等级**(从低到高): - DEBUG:$level=10$ - INFO:$level=20$ - WARNING:$level=30$ - ERROR:$level=40$ - CRITICAL:$level=50$ 2. **日志传播**: - 默认向父记录器传播,可通过`logger.propagate = False`关闭[^1] 3. **格式化符号**: - `%(asctime)s`:时间戳 - `%(levelname)s`:日志级别 - `%(filename)s`:文件名 - `%(message)s`:日志内容 - [完整字段列表](https://docs.python.org/3/library/logging.html#logrecord-attributes) #### 高级配置 ```python # 日志文件轮转(每天生成新文件) from logging.handlers import TimedRotatingFileHandler rotating_handler = TimedRotatingFileHandler( "app.log", when="midnight", interval=1, backupCount=7 ) # 捕获未处理异常 def handle_exception(exc_type, exc_value, exc_traceback): logger.critical("未捕获异常", exc_info=(exc_type, exc_value, exc_traceback)) sys.excepthook = handle_exception ``` #### 最佳实践 1. 模块中使用`logger = logging.getLogger(__name__)`实现按模块命名 2. 生产环境建议使用`WARNING`作为默认级别 3. 敏感信息过滤:重写`Filter`类过滤密码等数据 4. 对于异步应用,使用`QueueHandler`避免阻塞[^1] > 示例输出: > ``` > [2023-10-05 14:30:22] - [INFO] - main.py:18 - 程序启动成功 > [2023-10-05 14:31:05] - [ERROR] - network.py:102 - 连接服务器超时 > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值