【Python】 模块之logging

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 前言    Python 的logging 模块定义的函数和类为应用程序和库实现了一个灵活的事件日志系统。该模块提供多种日志级别并且支持多种记录日志的方式比如 终端,文件等等。
前言
   Python 的logging 模块定义的函数和类为应用程序和库实现了一个灵活的事件日志系统。该模块提供多种日志级别并且支持多种记录日志的方式比如 终端,文件等等。在编写一个软件系统的时候 ,使用日志系统十分有必要 记录函数的执行过程和异常报错信息。本文算是一个学习笔记,对于跨文件引用的初学者有一定帮助。
一 入门 
talk is cheap ,show me the code.
1 例子  logt.py
  1. #!/usr/bin/python
  2. # -*- coding:utf-8 -*-
  3. import logging
  4. logging.debug('this is a debug message')
  5. logging.info('this is a info message')
  6. logging.warn('this is a warn message')
  7. logging.error('this is a error message')
  8. logging.critical('this is a critical message')
运行该脚本
  1. root@rac4:~# >python logt.py
  2. WARNING:root:this is a warn message
  3. ERROR:root:this is a error message
  4. CRITICAL:root:this is a critical message
看到这个输出 ,有人可能会有疑问 为什么 logging.debug()和logging.info()没有输出内容? 恩,这个是个好问题,莫慌,且看下文分析。
2. logging 的日志级别
logging 提供了完整的日志体系,支持五种日志级别以便记录程序的执行过程。
DEBUG         详细信息,典型地调试问题的时候会使用。
INFO             证明事情按预期工作。
WARNING    表明发生了一些意外,或者不久的将来会发生问题(如‘磁盘满了’)。软件还是在正常工作。
ERROR         由于更严重的问题,软件已不能执行一些功能了。
CRITICAL     严重错误,表明软件已不能继续运行了。
以上五种日志级别从低到高分别是:DEBUG < INFO < WARNING < ERROR < CRITICAL 。默认的是WARNING,只有日志级别高于WARNING的日志信息才会输出,而输出有两种方式 一种输出控制台,也是默认的方式,另一种是记录到文件中,如日志文件。
3 logging的配置
python提供了多种配置方式控制日志的显示格式,内容,目的等。如上述例子中的日志输出“WARNING:root:this is awarn message”。
显式创建记录器Logger、处理器Handler和格式化器Formatter,并进行相关设置;
通过简单方式进行配置,使用basicConfig()函数直接进行配置;
通过配置文件进行配置,使用fileConfig()函数读取配置文件;
通过配置字典进行配置,使用dictConfig()函数读取配置信息;
本文使用 basicConfig() 方式作为例子。
basicConfig()支持下列关键字参数。
格式    描述
filename    创建一个FileHandler,使用指定的文件名,而不是使用StreamHandler。
filemode    如果指明了文件名,指明打开文件的模式(如果没有指明filemode,默认为'a',即append方式)。
format        handler使用指明的格式化字符串。详细的请参考 官方文档
datefmt       使用指明的日期/时间格式 比如 '%Y-%m-%d %H:%M:%S'  2016-06-14 10:10:00。
level            指定logger的日志级别。
stream        使用指明的流来初始化StreamHandler。该参数与'filename'不兼容,如果两个都有,'stream'将被忽略。
  1. #!/usr/bin/python
  2. # -*- coding:utf-8 -*-
  3. import logging
  4. logging.basicConfig(level=logging.DEBUG,
  5.                 format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
  6.                 datefmt='%Y%m%d %H:%M:%S',
  7.                 filename='myapp.log',
  8.                 filemode='w')
  9. logging.info('info message')
  10. logging.warn('warn message')
  11. logging.error('error message')
  12. logging.critical('critical message')
二  进阶介绍
logging模块提供四个组件logger,handler,filter,formatter
logger:记录器,为应用代码提供日志接口。logger最长用的操作有两类:配置和发送日志消息。可以通过logging.getLogger(name 获取logger对象,如果不指定name则返回root对象,如第一个例子。多次使用相同的name调用getLogger方法返回同一个logger对象。
调用方法:
  1. logger = logging.getLogger(logger_name) #如果不指定 logger_name ,则默认创建一个root logger,见第一个例子。
  2. logger.setLevel(logging.ERROR)          #设置日志级别为ERROR,即只有日志级别大于等于ERROR的日志才会输出
  3. logger.addHandler(handler_name)         #为logger实例增加一个处理器
  4. logger.removeHandler(handler_name)      # 为logger实例删除一个处理器
handler:将日志内容发送到合适的目的,比如文件,终端等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。
详细信息请移步 官方文档
调用方法
  1. StreamHandler
  2. ch = logging.StreamHandler(stream=None)
  3. FileHandler
  4. fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)
返回FileHandler类的实例。指明的文件会被打开,并用作日志流。如果没有指明mode,使用'a'。如果encoding不为None,会用指定的编码来打开文件。如果delay为真,只到第一次调用emit()的时候才打开文件。默认情况下,文件会一直增长。
filter:提供一种优雅的方式决定一个日志记录是否发送到handler。
formatter:指定日志记录输出的具体格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。
现在我们测试另外一个例子 test_log.py ,该脚本定义了一个init_log 函数,通过传入的参数显示的配置logging。函数里面创建两个logging 实例,分别将日志输出到文件和终端。
  1. import logging
  2. import logging.handlers
  3. LOG_LEVELS = {'DEBUG': logging.DEBUG,
  4.               'INFO': logging.INFO,
  5.               'ERROR': logging.ERROR,
  6.               'CRITICAL': logging.CRITICAL }
  7. LOGGING_FORMAT = "%(asctime)s - [%(name)s] - [%(levelname)s] - %(message)s" #日志的输出的格式
  8. STANDARD_DATE_FORMAT = '%Y-%m-%d %H:%M:%S' #时间格式 2016-06-14 10:10:00
  9. DEFAULT_LOG_MAX_SIZE = 50 * 1024 * 1024    #当达到50M就进行切分
  10. def init_log(logger_name, level='DEBUG', logfile='/tmp/logtest.log',
  11.                  formatter=LOGGING_FORMAT, max_size=DEFAULT_LOG_MAX_SIZE):
  12.     logger = logging.getLogger(logger_name)         #初始化一个name为logger_name的logging实例
  13.     logger.setLevel(LOG_LEVELS[level])     #设置日志的级别
  14.     fh = logging.handlers.RotatingFileHandler(logfile, maxBytes=max_size,backupCount=3)
  15.     #定义日志输出到文件的handler ,也可以定义 fh=logging.FileHandler(logfile)
  16.     fh.setLevel(logging.DEBUG)
  17.     # create console handler with a higher log level
  18.     ch = logging.StreamHandler()           #定义日志输出到终端的handler
  19.     ch.setLevel(logging.INFO)
  20.     formatter = logging.Formatter(formatter)
  21.     fh.setFormatter(formatter)
  22.     ch.setFormatter(formatter)
  23.     # add the handlers to the logger
  24.     logger.addHandler(fh)
  25.     logger.addHandler(ch)
  26.     return logger

  27. if __name__ == '__main__':
  28.    LOGGER=init_log('youzan','INFO','0614.log')
  29.    LOGGER.info('info message')
  30.    LOGGER.warn('warn message')
  31.    LOGGER.error('error message')
  32.    LOGGER.critical('critical message')
执行该脚本 
  1. root@rac4:~# >python logconfig.py
  2. 2016-06-14 10:38:15,190 - [youzan] - [INFO] - info message
  3. 2016-06-14 10:38:15,190 - [youzan] - [WARNING] - warn message
  4. 2016-06-14 10:38:15,191 - [youzan] - [ERROR] - error message
  5. 2016-06-14 10:38:15,191 - [youzan] - [CRITICAL] - critical message
  6. 同时在 0614log 文件里面也会记录对应的log
  7. root@rac4:~# >cat 0614.log
  8. 2016-06-14 10:38:15,190 - [youzan] - [INFO] - info message
  9. 2016-06-14 10:38:15,190 - [youzan] - [WARNING] - warn message
  10. 2016-06-14 10:38:15,191 - [youzan] - [ERROR] - error message
  11. 2016-06-14 10:38:15,191 - [youzan] - [CRITICAL] - critical message
三 拓展 
其实这才是本章的重点,在构建一个整套的程序时,怎么全局配置logging 模块,并在不同的程序中调用呢?例子如下:
root@rac4:~/python# >tree .
.
├── log2.py          — 引用 logconfig中的logging 配置
├── logconfig.py   —配置logging 输出格式
特别注意,如果是跨文件访问定义的logconfig 配置 ,必须在 logconfig.py 所在的目录创建  __init__.py  文件 。 
log2.py
  1. import sys
  2. import os
  3. sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
  4. import logging
  5. from logconfig import init_log
  6. logger=init_log('logtest','INFO',log='666.log')  ##通过传参来定义新的 logging 模块配置。
  7. logger.info('this is a test %s'," yangyi@youzan.com")
  8. logger.debug('debug message')
  9. logger.warn('warn message')
  10. logger.error('error message')
  11. logger.critical('critical message')
  1. root@rac4:~# >python log2.py
  2. 2016-06-14 13:26:50,713 - [logtest] - [INFO] - this is a test yangyi@youzan.com
  3. 2016-06-14 13:26:50,713 - [logtest] - [WARNING] - warn message
  4. 2016-06-14 13:26:50,714 - [logtest] - [ERROR] - error message
  5. 2016-06-14 13:26:50,714 - [logtest] - [CRITICAL] - critical message
四 参考文章



目录
相关文章
|
8天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
18天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
40 5
|
29天前
|
Java 程序员 开发者
Python的gc模块
Python的gc模块
|
1月前
|
数据采集 Web App开发 JavaScript
python-selenium模块详解!!!
Selenium 是一个强大的自动化测试工具,支持 Python 调用浏览器进行网页抓取。本文介绍了 Selenium 的安装、基本使用、元素定位、高级操作等内容。主要内容包括:发送请求、加载网页、元素定位、处理 Cookie、无头浏览器设置、页面等待、窗口和 iframe 切换等。通过示例代码帮助读者快速掌握 Selenium 的核心功能。
96 5
|
2月前
|
Python
SciPy 教程 之 SciPy 模块列表 6
SciPy教程之常量模块介绍:涵盖公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率及力学单位。示例展示了角度单位转换为弧度的几个常用常量。
20 7
|
2月前
|
Python
SciPy 教程 之 SciPy 模块列表 7
`scipy.constants` 模块提供了常用的时间单位转换为秒数的功能。例如,`constants.hour` 返回 3600.0 秒,表示一小时的秒数。其他常用时间单位包括分钟、天、周、年和儒略年。
19 6
|
1月前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
18 1
|
1月前
|
XML 前端开发 数据格式
超级详细的python中bs4模块详解
Beautiful Soup 是一个用于从网页中抓取数据的 Python 库,提供了简单易用的函数来处理导航、搜索和修改分析树。支持多种解析器,如 Python 标准库中的 HTML 解析器和更强大的 lxml 解析器。通过简单的代码即可实现复杂的数据抓取任务。本文介绍了 Beautiful Soup 的安装、基本使用、对象类型、文档树遍历和搜索方法,以及 CSS 选择器的使用。
89 1
|
2月前
|
Python
SciPy 教程 之 SciPy 模块列表 9
SciPy教程之常量模块介绍,涵盖多种单位类型,如公制、质量、角度、时间、长度、压强等。示例展示了如何使用`scipy.constants`模块查询不同压强单位对应的帕斯卡值,包括atm、bar、torr、mmHg和psi。
16 1
|
2月前
|
Python
SciPy 教程 之 SciPy 模块列表 8
SciPy教程之常量模块单位类型介绍。该模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例展示了部分长度单位的转换值,例如英寸、英尺、海里等。
17 1