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中何种情况下需要使用断言
Apr 01 Python
对python字典元素的添加与修改方法详解
Jul 06 Python
Python3+Appium安装使用教程
Jul 05 Python
将python运行结果保存至本地文件中的示例讲解
Jul 11 Python
详解Python是如何实现issubclass的
Jul 24 Python
Django REST framework内置路由用法
Jul 26 Python
python word转pdf代码实例
Aug 16 Python
pytorch 输出中间层特征的实例
Aug 17 Python
解决python虚拟环境切换无效的问题
Apr 30 Python
python 如何设置守护进程
Oct 29 Python
Python利用zhdate模块实现农历日期处理
Mar 31 Python
详解NumPy中的线性关系与数据修剪压缩
May 25 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简单浏览目录内容的实现代码
2013/06/07 PHP
php中的钩子理解及应用实例分析
2019/08/30 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
javascript动态加载三
2012/08/22 Javascript
js substr支持中文截取函数代码(中文是双字节)
2013/04/17 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
常用的几个JQuery代码片段
2017/03/13 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
利用jQuery异步上传文件的插件用法详解
2017/07/19 jQuery
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
node结合swig渲染摸板的方法
2018/04/11 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
详解vue路由
2020/08/05 Javascript
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
在Python下尝试多线程编程
2015/04/28 Python
详谈Python高阶函数与函数装饰器(推荐)
2017/09/30 Python
对python添加模块路径的三种方法总结
2018/10/16 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
全球虚拟主机商:HostGator
2017/02/06 全球购物
泰国第一的化妆品网站:Konvy
2018/02/25 全球购物
护理自荐信
2013/10/22 职场文书
大三预备党员入党思想汇报
2014/01/08 职场文书
校园新闻广播稿
2014/01/10 职场文书
洗发水广告词
2014/03/13 职场文书
2014年五四青年节活动策划书
2014/04/22 职场文书
十七岁的单车观后感
2015/06/12 职场文书
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis