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中的类学习笔记
Sep 23 Python
Python实现的使用telnet登陆聊天室实例
Jun 17 Python
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
Jul 20 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
详解用python实现简单的遗传算法
Jan 02 Python
python 字典有序并写入json文件过程解析
Sep 30 Python
python中的对数log函数表示及用法
Dec 09 Python
python多线程和多进程关系详解
Dec 14 Python
利用Python网络爬虫爬取各大音乐评论的代码
Apr 13 Python
Python中os模块的简单使用及重命名操作
Apr 17 Python
Python基础之赋值,浅拷贝,深拷贝的区别
Apr 30 Python
pandas数值排序的实现实例
Jul 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/04/27 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
PHP实现的常规正则验证helper公共类完整实例
2017/04/27 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
javascript 验证日期的函数
2010/03/18 Javascript
JavaScript 继承使用分析
2011/05/12 Javascript
JS基于面向对象实现的放烟花效果
2015/05/07 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
Javascript的比较汇总
2016/07/25 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
jQuery简单获取DIV和A标签元素位置的方法
2017/02/07 Javascript
微信小程序 下拉菜单简单实例
2017/04/13 Javascript
基于JavaScript实现飘落星星特效
2017/08/10 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
python3实现UDP协议的服务器和客户端
2017/06/14 Python
Python调用C# Com dll组件实战教程
2017/10/12 Python
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
基于python实现蓝牙通信代码实例
2019/11/19 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
详解Python流程控制语句
2020/10/28 Python
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
怎样声明一个匿名的内部类
2016/06/01 面试题
公司前台辞职报告
2014/01/19 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
建房协议书
2014/04/11 职场文书
公证委托书
2014/08/01 职场文书
党员干部民主生活会议批评与自我批评材料
2014/09/20 职场文书
2014年人事专员工作总结
2014/11/19 职场文书
你知道哪几种MYSQL的连接查询
2021/06/03 MySQL
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS