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 相关文章推荐
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
Apr 13 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
Jan 22 Python
Python实现线程状态监测简单示例
Mar 28 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
May 31 Python
对Tensorflow中的变量初始化函数详解
Jul 27 Python
python调用百度REST API实现语音识别
Aug 30 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
使用python将图片按标签分入不同文件夹的方法
Dec 08 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
Feb 21 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
Aug 07 Python
Python异常模块traceback用法实例分析
Oct 22 Python
django rest framework serializer返回时间自动格式化方法
Mar 31 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扩展ZF――Validate扩展
2008/01/10 PHP
PHP编译安装时常见错误解决办法
2015/05/28 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
2010/03/14 Javascript
基于jQuery的获取标签名的代码
2012/07/16 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
jquery动态添加元素事件失效问题解决方法
2014/05/23 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
Bootstrap基本插件学习笔记之标签切换(17)
2016/12/08 Javascript
Node.js学习入门
2017/01/03 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
vue项目中使用Svg的方法
2018/10/24 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
简析Python的闭包和装饰器
2016/02/26 Python
python Celery定时任务的示例
2018/03/13 Python
pytorch构建网络模型的4种方法
2018/04/13 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
python pytest进阶之xunit fixture详解
2019/06/27 Python
python 反编译exe文件为py文件的实例代码
2019/06/27 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
基于Python中的yield表达式介绍
2019/11/19 Python
python词云库wordCloud使用方法详解(解决中文乱码)
2020/02/17 Python
基于python 将列表作为参数传入函数时的测试与理解
2020/06/05 Python
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
什么是规则表达式
2012/05/03 面试题
博士生入学考试推荐信
2013/11/17 职场文书
结婚周年感言
2014/02/24 职场文书
婚宴邀请函
2015/01/30 职场文书
工作态度不好检讨书
2015/05/06 职场文书
Python中else的三种使用场景
2021/06/16 Python