【Python】 模块之logging

简介: 前言    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
四 参考文章



目录
相关文章
|
17天前
|
存储 开发者 Python
Python中的collections模块与UserDict:用户自定义字典详解
【4月更文挑战第2天】在Python中,`collections.UserDict`是用于创建自定义字典行为的基类,它提供了一个可扩展的接口。通过继承`UserDict`,可以轻松添加或修改字典功能,如在`__init__`和`__setitem__`等方法中插入自定义逻辑。使用`UserDict`有助于保持代码可读性和可维护性,而不是直接继承内置的`dict`。例如,可以创建一个`LoggingDict`类,在设置键值对时记录操作。这样,开发者可以根据具体需求定制字典行为,同时保持对字典内部管理的抽象。
|
18天前
|
存储 缓存 算法
Python中collections模块的deque双端队列:深入解析与应用
在Python的`collections`模块中,`deque`(双端队列)是一个线程安全、快速添加和删除元素的双端队列数据类型。它支持从队列的两端添加和弹出元素,提供了比列表更高的效率,特别是在处理大型数据集时。本文将详细解析`deque`的原理、使用方法以及它在各种场景中的应用。
|
4天前
|
Python
python学习14-模块与包
python学习14-模块与包
|
5天前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。
|
10天前
|
索引 Python
「Python系列」Python operator模块、math模块
Python的`operator`模块提供了一系列内置的操作符函数,这些函数对应于Python语言中的内建操作符。使用`operator`模块可以使代码更加清晰和易读,同时也能提高性能,因为它通常比使用Python内建操作符更快。
27 0
|
15天前
|
数据采集 网络协议 API
python中其他网络相关的模块和库简介
【4月更文挑战第4天】Python网络编程有多个流行模块和库,如requests提供简洁的HTTP客户端API,支持多种HTTP方法和自动处理复杂功能;Scrapy是高效的网络爬虫框架,适用于数据挖掘和自动化测试;aiohttp基于asyncio的异步HTTP库,用于构建高性能Web应用;Twisted是事件驱动的网络引擎,支持多种协议和异步编程;Flask和Django分别是轻量级和全栈Web框架,方便构建不同规模的Web应用。这些工具使网络编程更简单和高效。
|
18天前
|
数据采集 数据挖掘 Python
Python中collections模块的Counter计数器:深入解析与应用
在Python的`collections`模块中,`Counter`是一个强大且实用的工具,它主要用于计数可哈希对象。无论是统计单词出现的频率,还是分析数据集中元素的分布情况,`Counter`都能提供快速且直观的结果。本文将深入解析`Counter`计数器的原理、用法以及它在实际应用中的价值。
|
19天前
|
Python
Python中的math和cmath模块:数学运算的得力助手
Python作为一种功能强大的编程语言,提供了丰富的数学运算功能。其中,math和cmath模块就是Python中用于数学运算的重要工具。math模块提供了基本的数学函数和常量,适用于实数运算;而cmath模块则提供了对复数运算的支持,使得Python在数学计算和工程应用中更加灵活和强大。
|
22天前
|
数据挖掘 Python
Python中的datetime模块:轻松拿捏时间操作
Python的`datetime`模块是处理日期和时间的核心工具,包括`date`、`time`、`datetime`、`timedelta`类。它可以创建、操作和格式化日期时间。
19 2
|
24天前
|
Python
Python random模块(获取随机数)常用方法和使用例子
`random`模块在Python中用于生成随机数。
20 0

热门文章

最新文章