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之yield表达式学习
Sep 02 Python
使用Python的判断语句模拟三目运算
Apr 24 Python
分析Python中设计模式之Decorator装饰器模式的要点
Mar 02 Python
python给微信好友定时推送消息的示例
Feb 20 Python
Django Rest framework三种分页方式详解
Jul 26 Python
Django框架创建mysql连接与使用示例
Jul 29 Python
tensorflow生成多个tfrecord文件实例
Feb 17 Python
python实现可下载音乐的音乐播放器
Feb 25 Python
OpenCV 表盘指针自动读数的示例代码
Apr 10 Python
Python读写csv文件流程及异常解决
Oct 20 Python
Python常用断言函数实例汇总
Nov 30 Python
Pandas中DataFrame交换列顺序的方法实现
Dec 14 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对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
如何使用Javascript获取距今n天前的日期
2013/07/08 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
2014/06/15 Javascript
angularjs学习笔记之完整的项目结构
2015/09/26 Javascript
Jquery操作cookie记住用户名
2016/03/29 Javascript
JS读写CSS样式的方法汇总
2016/08/16 Javascript
JS中正则表达式全局匹配模式 /g用法详解
2017/04/01 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 jQuery
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
Python实现获取命令行输出结果的方法
2017/06/10 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
2017/11/29 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
django foreignkey(外键)的实现
2019/07/29 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
2019/08/15 Python
python statsmodel的使用
2020/12/21 Python
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
MAC Cosmetics巴西官方网站:M·A·C彩妆
2019/04/18 全球购物
省优秀教师事迹材料
2014/01/30 职场文书
荷叶圆圆教学反思
2014/02/01 职场文书
安全生产活动月方案
2014/03/09 职场文书
工程质量承诺书范文
2014/03/27 职场文书
事业单位竞聘上岗实施方案
2014/03/28 职场文书
档案信息化建设方案
2014/05/16 职场文书
个人简历求职信范文
2015/03/20 职场文书
付款证明模板
2015/06/19 职场文书
2015秋季开学典礼主持词
2015/07/16 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
Python实战之用tkinter库做一个鼠标模拟点击器
2021/04/27 Python
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python
详解TypeScript的基础类型
2022/02/18 Javascript