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根据出生年份简单计算生肖的方法
Mar 27 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
Python画图实现同一结点多个柱状图的示例
Jul 07 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
Aug 07 Python
python 画3维轨迹图并进行比较的实例
Dec 06 Python
在notepad++中实现直接运行python代码
Dec 18 Python
Python PyInstaller安装和使用教程详解
Jan 08 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
May 20 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 Python
详解numpy.ndarray.reshape()函数的参数问题
Oct 13 Python
Python基础数据类型tuple元组的概念与用法
Aug 02 Python
一小时学会TensorFlow2之基本操作2实例代码
Sep 04 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(7) php 字符串相关应用
2010/03/05 PHP
php 强制下载文件实现代码
2013/10/28 PHP
PHP获取MAC地址的具体实例
2013/12/13 PHP
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
php自定义函数实现二维数组按指定key排序的方法
2016/09/29 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
ExtJS Grid使用SimpleStore、多选框的方法
2009/11/20 Javascript
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
JavaScript中实现sprintf、printf函数
2015/01/27 Javascript
JavaScript中计算网页中某个元素的位置
2015/06/10 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
JavaScript Promise 用法
2016/06/14 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
2016/09/05 Javascript
jQuery 常见小例汇总
2016/12/14 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
浅析微信扫码登录原理(小结)
2018/10/29 Javascript
支付宝小程序tabbar底部导航
2018/11/06 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
运用js实现图层拖拽的功能
2019/05/24 Javascript
JS实现导航栏楼层特效
2020/01/01 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
用Python中的wxPython实现最基本的浏览器功能
2015/04/14 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
pandas 实现字典转换成DataFrame的方法
2018/07/04 Python
Python Pandas数据中对时间的操作
2019/07/30 Python
python序列类型种类详解
2020/02/26 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
皇家阿尔伯特英国官方商店:Royal Albert骨瓷
2019/03/25 全球购物
标准自荐信范文
2014/01/29 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
英文辞职信范文
2015/05/13 职场文书