Python日志模块logging基本用法分析


Posted in Python onAugust 23, 2018

本文实例讲述了Python日志模块logging基本用法。分享给大家供大家参考,具体如下:

1. 基础用法

python提供了一个标准的日志接口,就是logging模块。日志级别有DEBUGINFOWARNINGERRORCRITICAL五种(级别依次升高),分别对应的函数为debug()info()warning()error()critical()

>>> import logging
>>> logging.debug("ni hao")
>>> logging.info("ni hao2")
>>> logging.warning("ni hao")
WARNING:root:ni hao
>>> logging.error("ni hao")
ERROR:root:ni hao
>>> logging.critical("ni hao")
CRITICAL:root:ni hao
>>>

可以发现debug()info()方法没有显示任何信息,这是因为默认的日志级别是WARNING,所以低于此级别的日志不会记录。

可以利用函数basicCinfig修改日志级别

>>> import logging
>>> logging.basicConfig(level=logging.INFO)
>>> logging.info("nihao")
INFO:root:nihao
>>> logging.debug("dfasl")
>>> logging.basicConfig(level=logging.DEBUG)
>>> logging.info(4)
INFO:root:4
>>>

basicConfig()函数还可以定义更多的内容,如

logging.basicConfig(format=log_format,datefmt='%Y-%m-%d %H:%M:%S %p',level=logging.DEBUG)

举例

import logging
log_format = '%(filename)s %(funcName)s %(asctime)s %(message)s'
log_filename = "logging_test.log"
logging.basicConfig(filename=log_filename, format=log_format, datefmt='%Y-%m-%d %H:%M:%S:%S %p', filemode='w', level=logging.INFO)
logging.warning("warning###########")
logging.warning("error@@@@@@@@@@@@@@")
logging.error("error~~~~~~~~~~~~~~~~")

结果(输出文件“logging_test.log”内容)

del.py <module> 2015-04-30 16:29:02:02 PM warning
del.py <module> 2015-04-30 16:29:02:02 PM error
del.py <module> 2015-04-30 16:29:02:02 PM error

logging.basicConfig函数各参数

  • filename: 指定日志文件名
  • filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
  • format: 指定输出的格式和内容,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: 打印日志信息
  • datefmt: 指定时间格式,同time.strftime()
  • level: 设置日志级别,默认为logging.WARNING
  • stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

注:日志的设置是使用basicConfig()方法,日志写入文件的默认方式是‘a',即“追加”,如果想覆盖文件,使用filemode='w'

logging模块的功能非常强大,可以通过更加自由的接口,自定义出更复杂的日志形式。需要用到下面3种对象loggerformatterhandler 。以下介绍logger

2. logger

logger对象直接提供日志接口。

通过handler对象可以把日志内容写到不同的地方。

例:将日志同时输出到文件和屏幕

#coding: utf-8
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh = logging.FileHandler("test.log")
ch = logging.StreamHandler()
fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger.addHandler(fh)    #可以设置addHandler添加内容(fh、ch、fh+ch),从而设置输出位置
logger.addHandler(ch)
logger.error("error$$$$$$$$$$")
logger.debug("aaaaa**********")

3. 模块

#! /usr/bin/env python
# --*-- coding:utf-8 --*--
import os
import logging
import logging.handlers
#LOGGER = logging.getLogger(__name__)
def init_log(LOGGER, log_file_path):
  LOGGER.setLevel(logging.INFO)
  ch = logging.StreamHandler()
  ch.setLevel(logging.INFO)
  formatter = logging.Formatter("%(asctime)s %(levelname)s %(filename)s(%(lineno)d) %(message)s ", "%Y-%m-%d %H:%M:%S")
  ch.setFormatter(formatter)
  LOGGER.addHandler(ch)
  log_dir = os.path.dirname(log_file_path)
  if not os.path.isdir(log_dir):
    os.makedirs(log_dir)
  fh = logging.handlers.RotatingFileHandler(log_file_path, maxBytes=10*1024*1024, backupCount=9)
  fh.setLevel(logging.INFO)
  fh.setFormatter(formatter)
  LOGGER.addHandler(fh)
if __name__=="__main__":
  print "Unsupported in main module..."

注:logging.handlers.RotatingFileHandler

这个Handler可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。最后重新创建 chat.log,继续输出日志信息。【这样保证了chat.log里面是最新的日志】它的构造函数是:

RotatingFileHandler(filename[, mode[, maxBytes[, backupCount]]])

其中filename和mode两个参数和FileHandler一样。

  • maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
  • backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python 排列组合之itertools
Mar 20 Python
Django中几种重定向方法
Apr 28 Python
Python计时相关操作详解【time,datetime】
May 26 Python
基于ID3决策树算法的实现(Python版)
May 31 Python
windows下Virtualenvwrapper安装教程
Dec 13 Python
python利用requests库模拟post请求时json的使用教程
Dec 07 Python
Python函数中不定长参数的写法
Feb 13 Python
django模型动态修改参数,增加 filter 字段的方式
Mar 16 Python
Python如何实现大型数组运算(使用NumPy)
Jul 24 Python
Python实战之用tkinter库做一个鼠标模拟点击器
Apr 27 Python
python b站视频下载的五种版本
May 27 Python
基于python定位棋子位置及识别棋子颜色
Jul 26 Python
Python多继承原理与用法示例
Aug 23 #Python
Python抽象和自定义类定义与用法示例
Aug 23 #Python
Python引用计数操作示例
Aug 23 #Python
python实现括号匹配的思路详解
Aug 23 #Python
使用Python实现一个栈判断括号是否平衡
Aug 23 #Python
Python wxpython模块响应鼠标拖动事件操作示例
Aug 23 #Python
示例详解Python3 or Python2 两者之间的差异
Aug 23 #Python
You might like
用PHP和MySQL保存和输出图片
2006/10/09 PHP
一个简单的自动发送邮件系统(二)
2006/10/09 PHP
使用php记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
PHP封装的非对称加密RSA算法示例
2018/05/28 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
js的with语句使用方法
2007/09/21 Javascript
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
非常好用的JsonToString 方法 简单实例
2013/07/18 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
jQuery实现进度条效果代码
2015/12/17 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
vue.js国际化 vue-i18n插件的使用详解
2017/07/07 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
微信小程序实现音频文件播放进度的实例代码
2020/03/02 Javascript
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
python脚本实现验证码识别
2018/06/07 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
2020/12/31 Python
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
师范生自荐信
2013/10/27 职场文书
计算机维护专业推荐信
2014/02/27 职场文书
清明节随笔
2015/08/15 职场文书