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实现读取命令行参数的方法
May 22 Python
教你用python3根据关键词爬取百度百科的内容
Aug 18 Python
在Python中使用AOP实现Redis缓存示例
Jul 11 Python
Python基于多线程实现抓取数据存入数据库的方法
Jun 22 Python
Django中更改默认数据库为mysql的方法示例
Dec 05 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
Dec 24 Python
利用nohup来开启python文件的方法
Jan 14 Python
wxpython绘制音频效果
Nov 18 Python
Python高级特性之闭包与装饰器实例详解
Nov 19 Python
如何理解python面向对象编程
Jun 01 Python
python怎么调用自己的函数
Jul 01 Python
教你怎么用PyCharm为同一服务器配置多个python解释器
May 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使用内置函数file_put_contents写入文件及追加内容的方法
2015/12/07 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
Javascript 复制数组实现代码
2009/11/26 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
js局部刷新页面时间具体实现
2013/07/04 Javascript
js中传递特殊字符(+,&amp;)的方法
2014/01/16 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
2014/02/11 Javascript
jQuery制作拼图小游戏
2015/01/12 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
Perl Substr()函数及函数的应用
2015/12/16 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
2017/08/31 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
使用post方法实现json往返传输数据的方法
2019/03/30 Javascript
Node.js从字符串生成文件流的实现方法
2019/08/18 Javascript
[52:07]完美世界DOTA2联赛PWL S3 LBZS vs access 第二场 12.10
2020/12/13 DOTA
基于python编写的微博应用
2014/10/17 Python
Python入门之modf()方法的使用
2015/05/15 Python
Python进阶学习之特殊方法实例详析
2017/12/01 Python
python实现kNN算法
2017/12/20 Python
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
python 文件查找及内容匹配方法
2018/10/25 Python
Python3实现计算两个数组的交集算法示例
2019/04/03 Python
Pandas之ReIndex重新索引的实现
2019/06/25 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
pytorch+lstm实现的pos示例
2020/01/14 Python
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
MYSQL基础面试题
2012/05/13 面试题
酒店销售主管岗位职责
2014/01/04 职场文书
蟋蟀的住宅教学反思
2014/04/26 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
小学语文教师年度考核个人总结
2015/02/05 职场文书
故意杀人案辩护词
2015/05/21 职场文书