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抓取网页正文的源码
Jun 11 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
python运行时间的几种方法
Jun 17 Python
Python用threading实现多线程详解
Feb 03 Python
Python工厂函数用法实例分析
May 14 Python
python 搭建简单的http server,可直接post文件的实例
Jan 03 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
Python 3.6 -win64环境安装PIL模块的教程
Jun 20 Python
Python中调用其他程序的方式详解
Aug 06 Python
python对验证码降噪的实现示例代码
Nov 12 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
Apr 17 Python
基于CentOS搭建Python Django环境过程解析
Aug 24 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 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
php中邮箱地址正则表达式实现与详解
2012/04/24 PHP
PHP中HTML标签过滤技巧
2014/01/07 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
JS实现的省份级联实例代码
2013/06/24 Javascript
纯js实现遮罩层效果原理分析
2014/05/27 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
python中xrange和range的区别
2014/05/13 Python
Python中文件操作简明介绍
2015/04/13 Python
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
Pycharm 设置默认头的图文教程
2019/01/17 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
pytorch实现onehot编码转为普通label标签
2020/01/02 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
医生自荐信
2013/10/11 职场文书
工程地质勘察专业大学生求职信
2013/10/13 职场文书
教师应聘个人求职信
2013/12/10 职场文书
公益活动邀请函
2014/02/05 职场文书
八项规定整改方案
2014/02/21 职场文书
春节晚会主持词
2014/03/24 职场文书
土木工程专业本科生求职信
2014/10/01 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
个人创业事迹材料
2014/12/30 职场文书
第四次工业革命,打工人与机器人的竞争
2022/04/21 数码科技