python中logging模块的一些简单用法的使用


Posted in Python onFebruary 22, 2019

用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这时候print就不大方便了,所以Python引入了logging模块来记录我想要的信息。

print也可以输入日志,logging相对print来说更好控制输出在哪个地方,怎么输出及控制消息级别来过滤掉那些不需要的信息。

1、日志级别

import logging # 引入logging模块
# 将信息打印到控制台上
logging.debug(u"苍井空")
logging.info(u"麻生希")
logging.warning(u"小泽玛利亚")
logging.error(u"桃谷绘里香")
logging.critical(u"泷泽萝拉")

回显:

python中logging模块的一些简单用法的使用

上面可以看到只有后面三个能打印出来

默认生成的root logger的level是logging.WARNING,低于该级别的就不输出了

级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG

debug : 打印全部的日志,详细的信息,通常只出现在诊断问题上

info : 打印info,warning,error,critical级别的日志,确认一切按预期运行

warning : 打印warning,error,critical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作

error : 打印error,critical级别的日志,更严重的问题,软件没能执行一些功能

critical : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行

这时候,如果需要显示低于WARNING级别的内容,可以引入NOTSET级别来显示:

import logging # 引入logging模块
logging.basicConfig(level=logging.NOTSET) # 设置日志级别
logging.debug(u"如果设置了日志级别为NOTSET,那么这里可以采取debug、info的级别的内容也可以显示在控制台上了")

回显:

python中logging模块的一些简单用法的使用

2、部分名词解释

Logging.Formatter:这个类配置了日志的格式,在里面自定义设置日期和时间,输出日志的时候将会按照设置的格式显示内容。

Logging.Logger:Logger是Logging模块的主体,进行以下三项工作:

1. 为程序提供记录日志的接口
2. 判断日志所处级别,并判断是否要过滤
3. 根据其日志级别将该条日志分发给不同handler

常用函数有:
Logger.setLevel() 设置日志级别
Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个Handler
Logger.addFilter() 添加一个Filter,过滤作用
Logging.Handler:Handler基于日志级别对日志进行分发,如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志。

常用函数有:
setLevel() 设置级别
setFormatter() 设置Formatter

3、日志输出-控制台

import logging # 引入logging模块
logging.basicConfig(level=logging.DEBUG,
          format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s') # logging.basicConfig函数对日志的输出格式及方式做相关配置
# 由于日志基本配置中级别设置为DEBUG,所以一下打印信息将会全部显示在控制台上
logging.info('this is a loggging info message')
logging.debug('this is a loggging debug message')
logging.warning('this is loggging a warning message')
logging.error('this is an loggging error message')
logging.critical('this is a loggging critical message')

上面代码通过logging.basicConfig函数进行配置了日志级别和日志内容输出格式;因为级别为DEBUG,所以会将DEBUG级别以上的信息都输出显示再控制台上。

回显:

python中logging模块的一些简单用法的使用

4、日志输出-文件

import logging # 引入logging模块
import os.path
import time
# 第一步,创建一个logger
logger = logging.getLogger()
logger.setLevel(logging.INFO) # Log等级总开关
# 第二步,创建一个handler,用于写入日志文件
rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
log_path = os.path.dirname(os.getcwd()) + '/Logs/'
log_name = log_path + rq + '.log'
logfile = log_name
fh = logging.FileHandler(logfile, mode='w')
fh.setLevel(logging.DEBUG) # 输出到file的log等级的开关
# 第三步,定义handler的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
# 第四步,将logger添加到handler里面
logger.addHandler(fh)
# 日志
logger.debug('this is a logger debug message')
logger.info('this is a logger info message')
logger.warning('this is a logger warning message')
logger.error('this is a logger error message')
logger.critical('this is a logger critical message')

回显(打开同一目录下生成的文件):

python中logging模块的一些简单用法的使用

python中logging模块的一些简单用法的使用

5、日志输出-控制台和文件

只要在输入到日志中的第二步和第三步插入一个handler输出到控制台:

创建一个handler,用于输出到控制台

ch = logging.StreamHandler()
ch.setLevel(logging.WARNING) # 输出到console的log等级的开关

第四步和第五步分别加入以下代码即可

ch.setFormatter(formatter)
logger.addHandler(ch)

6、format常用格式说明

  • %(levelno)s: 打印日志级别的数值
  • %(levelname)s: 打印日志级别名称
  • %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
  • %(filename)s: 打印当前执行程序名
  • %(funcName)s: 打印日志的当前函数
  • %(lineno)d: 打印日志的当前行号
  • %(asctime)s: 打印日志的时间
  • %(thread)d: 打印线程ID
  • %(threadName)s: 打印线程名称
  • %(process)d: 打印进程ID
  • %(message)s: 打印日志信息

7、捕捉异常,用traceback记录

import os.path
import time
import logging
# 创建一个logger
logger = logging.getLogger()
logger.setLevel(logging.INFO) # Log等级总开关

# 创建一个handler,用于写入日志文件
rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
log_path = os.path.dirname(os.getcwd()) + '/Logs/'
log_name = log_path + rq + '.log'
logfile = log_name
fh = logging.FileHandler(logfile, mode='w')
fh.setLevel(logging.DEBUG) # 输出到file的log等级的开关

# 定义handler的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
logger.addHandler(fh)
# 使用logger.XX来记录错误,这里的"error"可以根据所需要的级别进行修改
try:
  open('/path/to/does/not/exist', 'rb')
except (SystemExit, KeyboardInterrupt):
  raise
except Exception, e:
  logger.error('Failed to open file', exc_info=True)

回显(存储在文件中):

python中logging模块的一些简单用法的使用

如果需要将日志不上报错误,仅记录,可以将exc_info=False,回显如下:

8、多模块调用logging,日志输出顺序

warning_output.py

import logging
def write_warning():
  logging.warning(u"记录文件warning_output.py的日志")

error_output.py

import logging
def write_error():
  logging.error(u"记录文件error_output.py的日志")

main.py

import logging
import warning_output
import error_output
def write_critical():
  logging.critical(u"记录文件main.py的日志")


warning_output.write_warning() # 调用warning_output文件中write_warning方法
write_critical()
error_output.write_error() # 调用error_output文件中write_error方法

回显:

python中logging模块的一些简单用法的使用

从上面来看,日志的输出顺序和模块执行顺序是一致的。

9、日志滚动和过期删除(按时间)

# coding:utf-8
import logging
import time
import re
from logging.handlers import TimedRotatingFileHandler
from logging.handlers import RotatingFileHandler


def backroll():
  #日志打印格式
  log_fmt = '%(asctime)s\tFile \"%(filename)s\",line %(lineno)s\t%(levelname)s: %(message)s'
  formatter = logging.Formatter(log_fmt)
  #创建TimedRotatingFileHandler对象
  log_file_handler = TimedRotatingFileHandler(filename="ds_update", when="M", interval=2, backupCount=2)
  #log_file_handler.suffix = "%Y-%m-%d_%H-%M.log"
  #log_file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}.log$")
  log_file_handler.setFormatter(formatter)
  logging.basicConfig(level=logging.INFO)
  log = logging.getLogger()
  log.addHandler(log_file_handler)
  #循环打印日志
  log_content = "test log"
  count = 0
  while count < 30:
    log.error(log_content)
    time.sleep(20)
    count = count + 1
  log.removeHandler(log_file_handler)


if __name__ == "__main__":
  backroll()

filename:日志文件名的prefix;

when:是一个字符串,用于描述滚动周期的基本单位,字符串的值及意义如下:
“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight

interval: 滚动周期,单位有when指定,比如:when='D',interval=1,表示每天产生一个日志文件

backupCount: 表示日志文件的保留个数

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
解密Python中的描述符(descriptor)
Jun 03 Python
Python编程实现蚁群算法详解
Nov 13 Python
python自动查询12306余票并发送邮箱提醒脚本
May 21 Python
浅谈Pycharm中的Python Console与Terminal
Jan 17 Python
详解Python正则表达式re模块
Mar 19 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
Aug 08 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
Oct 18 Python
python 实现绘制整齐的表格
Nov 18 Python
使用pycharm和pylint检查python代码规范操作
Jun 09 Python
python 基于pygame实现俄罗斯方块
Mar 02 Python
Python Django搭建文件下载服务器的实现
May 10 Python
Python 如何解决稀疏矩阵运算
May 26 Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 #Python
Python3.6.x中内置函数总结及讲解
Feb 22 #Python
python自定义线程池控制线程数量的示例
Feb 22 #Python
Python实现多进程的四种方式
Feb 22 #Python
python在回调函数中获取返回值的方法
Feb 22 #Python
python实现批量注册网站用户的示例
Feb 22 #Python
Python多进程fork()函数详解
Feb 22 #Python
You might like
php array_slice函数的使用以及参数详解
2008/08/30 PHP
php 判断是否是中文/英文/数字示例代码
2013/09/30 PHP
学习php分页代码实例
2013/10/24 PHP
PHP实现仿Google分页效果的分页函数
2015/07/29 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
PHP消息队列用法实例分析
2016/02/12 PHP
PHP 获取客户端 IP 地址的方法实例代码
2018/11/11 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
PHP网站常见安全漏洞,及相应防范措施总结
2021/03/01 PHP
基于jquery打造的百分比动态色彩条插件
2012/09/19 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
对比分析json及XML
2014/11/28 Javascript
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
js实现文字滚动效果
2016/03/03 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
浅谈Vuex注入Vue生命周期的过程
2019/05/20 Javascript
如何使用JavaScript实现无缝滚动自动播放轮播图效果
2020/08/20 Javascript
小程序实现可拖动的悬浮按钮
2020/09/07 Javascript
TypeScript魔法堂之枚举的超实用手册
2020/10/29 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
python中__call__方法示例分析
2014/10/11 Python
python实现csv格式文件转为asc格式文件的方法
2018/03/23 Python
python抓取需要扫微信登陆页面
2019/04/29 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
python下载卫星云图合成gif的方法示例
2020/02/18 Python
python爬虫请求头设置代码
2020/07/28 Python
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
全球最大化妆品零售网站:SkinStore
2020/10/24 全球购物
宠物店的创业计划书范文
2014/01/11 职场文书
遗嘱继承公证书
2014/04/09 职场文书
优质服务口号
2014/06/11 职场文书
教师民族团结演讲稿
2014/08/27 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书