当前位置:   article > 正文

python——日志模块_python 日志模块

python 日志模块

        日志主要用于记录程序运行情况,以便程序报错能够快速定位到问题。Python自带日志操作模块,即logging模块

一、Logging模块

1、日志等级划分及作用

        日志有6个等级,等级由低到高分别是NOTEST<DEBUG<INFO<WARING<ERROR<CRITICAL。其中DEBUG记录最详细的内容,WARING是默认的级别。如果需要更改日志级别,则需要手动修改日志级别。代码如下:

logging.basicConfig(level=logging.DEBUG)
2、日志输出格式设置

        日志输出格式的设置需要用到basicConfig方法,基础使用代码如下:

  1. LOG_FORMAT = "%(asctime)s-(message)s"
  2. logging.basicConfig(filename='log_test.log',
  3. level=logging.DEBUG,
  4. encoding='utf-8',
  5. datefmt='%Y-%m-%d %H:%M:%S',
  6. format = LOG_FORMAT)

        basicConfig方法具有多个属性,具体如下:

参数名称

说明

Filename

指日志要输出到指定的文件

Filemode

指打开文件的方式,默认为‘a’,追加写入

Datefmt

用于指定日期/时间格式

Level

用于指定日志级别

Encoding

用于指定输出日志编码格式

Format

用于指定输出日志内容,例如日志发生时间

3、Format参数值

        Format参数值具有多种配置格式,配置内容间使用连接符进行连接,可支持自定义。常用值列表:

名称

说明

%(name)s

logger 的名字

%(asctime)s

日志时间,注意可以datefmt参数设置格式

%(message)s

日志信息

%(filename)s

执行程序文件名

%(pathname)s

执行程序路径名

%(process)d

进程id

%(thread)d

线程id

%(threadName)s

线程名称

%(levelno)s

日志级别数值

%(levelname)s

日志级别名称

%(lineno)d

调用代码所在行

%(module)s

调用日志输出函数的模块

%(funcName)s

调用日志输出函数的函数名

4、日志进阶

        在项目中通过日志统一配置,不仅能够实现将程序日志统一记录在同一个文件中,也能够实现在记入文件的同时,在终端也打印日志,还能够实现将错误日志单独错误日志文件。Logging模块可以分为logger、handler、formatter和fiter4个部分,4部分的层级结构为:

4.1 Logger:

        Logger对象是应用程序代码与日志记录系统之间的接口,是日志记录的入口点,用于创建日志记录器。可以设置不同的日志级别。可以通过getlogger()获取logger对象,一般默认为root,也可以自定义。

  1. import logging
  2. # 默认root
  3. logger1 = logging.getLogger()
  4. # 设置日志级别为debug级别
  5. logger1.level=logging.DEBUG
  6. print(logger1)
  7. # 结果值:<RootLogger root (DEBUG)>
  8. # 自定义logger对象
  9. logger2 = logging.getLogger(__name__)
  10. print(logger2)
  11. # 结果值:<Logger __main__ (DEBUG)>

        logger很明显的缺点是无法多进程,例如给对象logger1设置日志级别,logger2的日志级别也同时改变了。

4.2 handler:

        handler对象用于将日志记录发送到指定的位置,这个位置可以是控制台、文件、网络等。不同的handler负责将日志发送到不同的位置。常用的handler有StreamHandler(发送到控制台)、FileHandler(发送到文件)、SMTPHandler(发送到邮件)、HTTPHandler(通过HTTP发送日志)。

  1. # 导入日志模块
  2. import logging
  3. logger = logging.getLogger(__name__)
  4. logger.setLevel(logging.DEBUG)
  5. handler = logging.StreamHandler()
  6. handler.setLevel(logging.DEBUG)
  7. logger.addHandler(handler)
  8. logger.debug("这是一个从控制台输出的DEBUG级别日志")
4.3 Formatter:

        Formatter用于设置日志输出最终格式,可以为每个handler设置不同Formatter。

  1. # 导入日志模块
  2. import logging
  3. logger = logging.getLogger(__name__)
  4. logger.setLevel(logging.DEBUG)
  5. handler = logging.StreamHandler()
  6. handler.setLevel(logging.DEBUG)
  7. # 设置日志输出格式
  8. formatter = logging.Formatter("%(asctime)s - %(message)s", datefmt='%Y-%m-%d %H:%M:%S')
  9. handler.setFormatter(formatter)
  10. logger.addHandler(handler)
  11. logger.debug("这是一个从控制台输出的DEBUG级别日志")
4.4 Filter:

        Filter(过滤器)用于决定日志内容是否被输出,可以依据各种标准,例如日志内容、日志级别、logger名称等。而且,每个handler可以设置多个Filter。

  1. # 导入日志模块
  2. import logging
  3. logger = logging.getLogger('main')
  4. logger.setLevel(logging.DEBUG)
  5. print(logger)
  6. handler = logging.StreamHandler()
  7. handler.setLevel(logging.DEBUG)
  8. # 设置日志输出格式
  9. formatter = logging.Formatter("%(asctime)s - %(message)s", datefmt='%Y-%m-%d %H:%M:%S')
  10. handler.setFormatter(formatter)
  11. logger.addHandler(handler)
  12. # 定义 Filter 过滤器:判断给定字符 与 logger 的名称前缀是否匹配
  13. # 默认全匹配,可选操作
  14. flt = logging.Filter('main')
  15. logger.addFilter(flt)
  16. logger.debug("这是一个从控制台输出的DEBUG级别日志")

二、实例

        设置三个handler,第一个输出到文件中,记录详细日志内容;第二个输出到控制台,记录详细日志内容;第三个输出到文件中,记录ERROR级别日志内容。

1、新建配置模块log_setting1.py
  1. # 导入日志模块
  2. import logging
  3. def set_log_config(set_level):
  4. # 得到logger对象
  5. logger = logging.getLogger()
  6. logger.setLevel(set_level)
  7. # 设置第一个handler
  8. info_handler = logging.FileHandler(filename='../settings/info_log.log', mode='a', encoding='utf-8')
  9. logger.addHandler(info_handler)
  10. # 设置第二个handler
  11. stream_handler = logging.StreamHandler()
  12. logger.addHandler(stream_handler)
  13. # 设置第三个handler
  14. err_handler = logging.FileHandler(filename='../settings/err_log.log', mode='a', encoding='utf-8')
  15. err_handler.setLevel(logging.ERROR)
  16. logger.addHandler(err_handler)
  17. # 设置输出格式
  18. formatter = logging.Formatter(fmt='%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
  19. info_handler.setFormatter(formatter)
  20. stream_handler.setFormatter(formatter)
  21. err_handler.setFormatter(formatter)
2、新建程序入口
  1. import logging
  2. from settings.log_setting1 import set_log_config
  3. set_log_config('DEBUG')
  4. logging.info('这是一个info级别的日志')
  5. logging.debug('这是一个debug级别的日志')
  6. logging.warning('这是一个warning级别的日志')
  7. logging.error('这是一个error级别的日志')
3、输出结果

        控制台输出结果为:

  1. 2024-06-28 17:17:35 - 这是一个info级别的日志
  2. 2024-06-28 17:17:35 - 这是一个debug级别的日志
  3. 2024-06-28 17:17:35 - 这是一个warning级别的日志
  4. 2024-06-28 17:17:35 - 这是一个error级别的日志

        在指定目录下生成info_log.log和err_log.log文件,在info_log.log中与控制台输出内容一致;在err_log.log中仅展示ERROR级别的日志信息。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/963090
推荐阅读
相关标签
  

闽ICP备14008679号