Py学习  »  Python

Python基础 logging模块使用(一)

伊洛的小屋 • 4 年前 • 93 次点击  
一. 日志的作用
  • 日志是对软件执行时所发生事件的一种追踪方式,无论是开发人员还是测试人员,日志的重要的作用应该是不言而喻的;不但可以帮助开发定位缺陷解决问题,也可以辅助在测试过程中的测试工程师定位缺陷。
    作为测试人员更应该重视日志,无论是单元测试去捕获 Traceback ,还是做 接口/UI自动化 都应当输出有必要的日志

本文首发自伊洛的个人博客: https://yiluotalk.com ,欢迎关注并查看更多内容!!!

  • 那么 python 中,怎么可以做到一个算是标准的日志记录呢? 很多人会使用 print 直接输出的方式,但是其实这事极为不规范的做法,来看看官网上怎么说
    截图来自官网
  • 今天就来简单的介绍下 python logging 模块的基本使用方法
二. 日志的级别
  • 5个级别分别是,可以注意到源码中, WARN = WARNING ,后续使用中两者是一个意思
    截图来自官网
  • 每个级别都有对应的一个值


三. logging的工作流程
  • 还是先来看看官网上的流程图


    截图来自官网
  • 可以看到以下几种类型, Logger、LogRecord、Filter、Handler、Formatter
  1. Logger :是进行日志记录时创建的对象
  2. LogRecord :日志记录器,将日志传到相应的处理器处理
  3. Handler :即用来处理日志记录的类
  4. Filter :过滤器
  5. Formatter :格式化器, 指明了最终输出中日志记录的布局
四. 简单的例子
# 伊洛Yiluo
# https://yiluotalk.com
import logging

logging.debug('调试信息')
logging.info('信息消息')
logging.warning('错误:config file %s not found', 'server.conf')
logging.error('发生错误')
logging.critical('关键错误')
  • 看以下输出结果
WARNING:root:错误:config file server.conf not found
ERROR:root:发生错误
CRITICAL:root:关键错误

Process finished with exit code 0
五. basicConfig() 使用方法
  • basicConfig() 主要做一些基础的配置
  • 我们将日志的结果输出到一个名为 "test.log" 的文件
# 伊洛Yiluo
# https://yiluotalk.com
import logging

logging.basicConfig(filename="test.log", filemode="w", level=logging.DEBUG)
logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')
  • 打开 "test.log" 文件
DEBUG:root:This is a debug message
INFO:root:This is an info message
WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical message
  • filename :即日志输出的文件名
  • filemode :这个是指定日志文件的写入方式
  • format :指定日志信息的输出格式
  • datefmt :指定时间的输出格式
  • level :指定日志输出的类别
六. 自定义 Logger
  • 定义一个 Logger ,名字为 test_log , 通常默认为 __name__
# 伊洛Yiluo
# https://yiluotalk.com
import logging

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger('test_log')

logger.info('info log1')
logger.debug('debug log')
logger.warning('warning log')
logger.info('info log2')
logger.info('info log3')
logger.critical('critical log')
  • 查看文件的日志结果
2020-02-13 09:49:51,040 - test_log - INFO - info log1
2020-02-13 09:49:51,040 - test_log - WARNING - warning log
2020-02-13 09:49:51,040 - test_log - INFO - info log2
2020-02-13 09:49:51,040 - test_log - INFO - info log3
2020-02-13 09:49:51,040 - test_log - CRITICAL - critical log
七. 设置等级
  • 设置等级为 WARNING ,打印出包括这个等级及这个等级之上级别的日志
# 伊洛Yiluo
# https://yiluotalk.com
import logging

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger('test_log')
logger.setLevel(level=logging.WARNING)

logger.info('info log1')
logger.debug('debug log')
logger.warning('warning log')
logger.info('info log2')
logger.info('info log3')
logger.critical('critical log')
  • 如下按照等级打印出了日志的信息
2020-02-13 10:04:57,325 - test_log - WARNING - warning log
2020-02-13 10:04:57,325 - test_log - CRITICAL - critical log

Process finished with exit code 0

八. Handler 的使用
  • 重新记录一个日志的文件名为 'test_log.log'
# 伊洛Yiluo
# https://yiluotalk.com
import logging

logger = logging.getLogger('test_log')
logger.setLevel(level=logging.DEBUG)
handler = logging.FileHandler('test_log.log')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

logger.info('info log1')
logger.debug('debug log')
logger.warning('warning log')
logger.info('info log2')
logger.info('info log3')
logger.critical('critical log')
  • 查看日志文件的结果为
2020-02-13 10:44:55,888 - test_log - INFO - info log1
2020-02-13 10:44:55,888 - test_log - DEBUG - debug log
2020-02-13 10:44:55,889 - test_log - WARNING - warning log
2020-02-13 10:44:55,889 - test_log - INFO - info log2
2020-02-13 10:44:55,889 - test_log - INFO - info log3
2020-02-13 10:44:55,889 - test_log - CRITICAL - critical log
九. 多个handler
  • 一个 handler 输出到 控制台 ,一个 handler 输出到日志文件
# 伊洛Yiluo
# https://yiluotalk.com
import logging
import sys

logger = logging.getLogger('test_log')
logger.setLevel(level=logging.INFO)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# 输出到控制台的handler
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(level=logging.INFO)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)

# 输出到文件的handler
file_handler = logging.FileHandler('test_log.log')
file_handler.setLevel(level=logging.DEBUG)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)


logger.info('info log1')
logger.debug('debug log')
logger.warning('warning log')
logger.info('info log2')
logger.info('info log3')
logger.critical('critical log')

  • 输出都控制台
2020-02-13 11:05:49,000 - test_log - INFO - info log1
2020-02-13 11:05:49,001 - test_log - WARNING - warning log
2020-02-13 11:05:49,001 - test_log - INFO - info log2
2020-02-13 11:05:49,001 - test_log - INFO - info log3
2020-02-13 11:05:49,001 - test_log - CRITICAL - critical log
  • 输出到日志
2020-02-13 11:06:54,721 - test_log - INFO - info log1
2020-02-13 11:06:54,722 - test_log - WARNING - warning log
2020-02-13 11:06:54,722 - test_log - INFO - info log2
2020-02-13 11:06:54,722 - test_log - INFO - info log3
2020-02-13 11:06:54,722 - test_log - CRITICAL - critical log
待续文件配置,配置共享等......

欢迎下方【戳一下】【点赞】
Author:伊洛Yiluo
愿你享受每一天,Just Enjoy !

关注公众号获取更多内容
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/54620
 
93 次点击