Python logging记录日志

调试的几种方法:

  • 使用print()在控制台上输出
  • 使用assert断言
  • 使用logging模块

logging提供了一组便利的函数,用来做简单的日志,(当然也能利用日志调试程序)。

与使用print()相比,logging有以下的优势:

  • 你可以控制消息的级别,过滤掉那些并不重要的消息。
  • 你可决定输出到什么地方,以及怎么输出。

logging跟踪事件的级别:

  • DEBUG:详细信息,典型地调试问题时会感兴趣。
  • INFO:证明事情按预期工作。
  • WARNING:表明发生了一些意外,或者不久的将来会发生问题(如‘磁盘满了’)。软件还是在正常工作。
  • ERROR:由于更严重的问题,软件已不能执行一些功能了。
  • CRITICAL:严重错误,表明软件已不能继续运行了。

logging的默认级别为 WARNING,表示只有该级别及其以上的事件会被跟踪,当然也可以自定义跟踪的级别。

使用basicConfig()进行配置:

import logging
logging.basicConfig(level=logging.DEBUG)
for i in range(5):
x=i*i
logging.info('%d has been calculated',i)

输出为:

INFO:root:0 has been calculated
INFO:root:1 has been calculated
INFO:root:2 has been calculated
INFO:root:3 has been calculated
INFO:root:4 has been calculated

设置log文件和输出格式:

import logging
logging.basicConfig(filename="test.log",format="%(levelname)s:%(asctime)s %(message)s",level=logging.INFO)
for i in range(5):
x=i*i
logging.info('%d has been calculated',i)

输出为:

INFO:2017-08-15 16:17:58,448 0 has been calculated
INFO:2017-08-15 16:17:58,448 1 has been calculated
INFO:2017-08-15 16:17:58,448 2 has been calculated
INFO:2017-08-15 16:17:58,448 3 has been calculated
INFO:2017-08-15 16:17:58,448 4 has been calculated

每次运行的结果会追加到log文件中,如果你希望每次运新都重新开始,而不是记住先前运行的消息,你可以设置filemode参数:

logging.basicConfig(filename="test.log",filemode='w',format="%(levelname)s:%(asctime)s %(message)s",level=logging.INFO)

注意:对于basicConfig() 的调用要早于任何对debug()、info()等的调用。

通过INI文件进行配置

假设文件名为 logging_config.ini,加入内容:

[loggers]
keys=root [handlers]
keys=stream_handler [formatters]
keys=formatter [logger_root]
level=DEBUG
handlers=stream_handler [handler_stream_handler]
class=StreamHandler
level=DEBUG
formatter=formatter
args=(sys.stderr,) [formatter_formatter]
format=%(asctime)s %(name)-12s %(levelname)-8s %(message)s

然后在源码中调用 logging.config.fileConfig() 方法:

import logging
from logging.config import fileConfig fileConfig('logging_config.ini')
logger = logging.getLogger()
logger.debug('often makes a very good meal of %s', 'visiting tourists')

通过字典进行配置

你也可以使用字典实现详细配置:

import logging
from logging.config import dictConfig logging_config = dict(
version = 1,
formatters = {
'f': {'format':
'%(asctime)s %(name)-12s %(levelname)-8s %(message)s'}
},
handlers = {
'h': {'class': 'logging.StreamHandler',
'formatter': 'f',
'level': logging.DEBUG}
},
root = {
'handlers': ['h'],
'level': logging.DEBUG,
},
) dictConfig(logging_config) logger = logging.getLogger()
logger.debug('often makes a very good meal of %s', 'visiting tourists')

通过源码直接配置

import logging

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
'%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG) logger.debug('often makes a very good meal of %s', 'visiting tourists')

例如将logging同时输出到屏幕和文件

import logging
logger = logging.getLogger() # 不加名称设置root logger
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s: - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
# 使用FileHandler输出到文件
fh = logging.FileHandler('log.txt')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
# 使用StreamHandler输出到屏幕
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
# 添加两个Handler
logger.addHandler(ch)
logger.addHandler(fh)
logger.info('this is info message')
logger.warn('this is warn message')
def get_logger(filename,level='info',mode='a',encoding='utf-8'):
level_relations = {
'debug':logging.DEBUG,
'info':logging.INFO,
'warning':logging.WARNING,
'error':logging.ERROR,
'crit':logging.CRITICAL}
fmt='%(asctime)s-[%(pathname)s line:%(lineno)d]-%(levelname)s: %(message)s'
format_str = logging.Formatter(fmt)#设置日志格式
logger = logging.getLogger()
logger.setLevel(level_relations.get(level))#设置日志级别 (注意这里会创建一个标准输出的handler)
logger.handlers.pop()
sh = logging.StreamHandler()#往屏幕上输出
sh.setFormatter(format_str) #设置屏幕上显示的格式
fh = logging.FileHandler(filename=filename,mode='a',encoding='utf-8')
fh.setFormatter(format_str)
logger.addHandler(sh) #把对象加到logger里
logger.addHandler(fh)
return logger logger = get_logger('log',level='debug')

更多内容见:

每个 Python 程序员都要知道的日志实践

python高级的日志教程

Advanced Logging Tutorial

日志Cookbook

Python logging记录日志的更多相关文章

  1. python logging记录日志的方式

    python的logging模块提供了标准的日志接口,可以通过它存储各种格式的日志,日志级别等级:critical > error > warning > info > deb ...

  2. python logging 配置

    python logging 配置 在python中,logging由logger,handler,filter,formater四个部分组成,logger是提供我们记录日志的方法:handler是让 ...

  3. Python LOGGING使用方法

    Python LOGGING使用方法 1. 简介 使用场景 场景 适合使用的方法 在终端输出程序或脚本的使用方法 print 报告一个事件的发生(例如状态的修改) logging.info()或log ...

  4. python logging模块使用流程

    #!/usr/local/bin/python # -*- coding:utf-8 -*- import logging logging.debug('debug message') logging ...

  5. python logging模块使用教程

    简单使用 #!/usr/local/bin/python # -*- coding:utf-8 -*- import logging logging.debug('debug message') lo ...

  6. logging记录日志

    日志是一个系统的重要组成部分,用以记录用户操作.系统运行状态和错误信息.日志记录的好坏直接关系到系统出现问题时定位的速度.logging模块Python2.3版本开始成为Python标准库的一部分. ...

  7. Python logging模块无法正常输出日志

    废话少说,先上代码 File:logger.conf [formatters] keys=default [formatter_default] format=%(asctime)s - %(name ...

  8. 0x03 Python logging模块之Formatter格式

    目录 logging模块之Formatter格式 Formater对象 日志输出格式化字符串 LogRecoder对象 时间格式化字符串 logging模块之Formatter格式 在记录日志是,日志 ...

  9. python logging模块可能会令人困惑的地方

    python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ...

随机推荐

  1. tomcat服务器基本操作:实现www.baidu.com访问tomcat中项目

    0.实现用其他的域名,而不再使用localhost:8080/xxx,访问tomcat中的项目: (1). 修改访问tomcat的端口号: (2). tomcat配置虚拟主机: (3). 本地DNS解 ...

  2. Docker+Nginx使用流程(笔记)

    Docker+Nginx使用流程 本教程依据个人理解并经过实际验证为正确,特此记录下来,权当笔记. 注:基于linux操作系统 # uname -r 查看你当前的内核版本 # yum -y insta ...

  3. .net core 3.0 搭建 IdentityServer4 验证服务器

    叙述 最近在搞 IdentityServer4  API接口认证部分,由于之前没有接触过 IdentityServer4 于是在网上一顿搜搜搜,由于自己技术水平也有限,看了好几篇文章才搞懂,想通过博客 ...

  4. Qt 下QMessageBox下中文乱码问题

    Qt版本 Qt Creator 2.4.1 Based on Qt 4.8.0 (64 bit) 现象 QMessageBox调用setText()一直是乱码 解决方法 QTextCodec::set ...

  5. Queue and deque

    Queue : 队列 队列(Queue)是常用的数据结构,可以将队列看成特殊的线性表,队列限制了对线性表的访问方式:只能从线性表的一端添加(offer)元素,从另一端取出(poll)元素. 队列遵循先 ...

  6. 理解TCP/IP协议栈之HTTP2.0

    1 前言 前面写了10多篇关于Redis底层实现.工程架构.实际应用的文章,感兴趣的读者可以进行阅读,如有问题欢迎交流: 1.Redis面试热点之底层实现篇-12.Redis面试热点之底层实现篇-23 ...

  7. 数字任意组合 - gcd

    链接:https://www.nowcoder.com/acm/contest/160/A来源:牛客网 题目描述有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上a1,a2,...,an ...

  8. 两个大数相乘 - 高精度FFT

    HDU 1402 A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  9. Cannot create PoolableConnectionFactory (Could not create connection to database server.)

    是由于mysql驱动版本太低导致. 本人 jdk版本是1.8.0_211,mysql版本是8.0.17,mysql-connector-java版本是5.1.39, 后来把mysql-connecto ...

  10. Redis(四):del/unlink 命令源码解析

    上一篇文章从根本上理解了set/get的处理过程,相当于理解了 增.改.查的过程,现在就差一个删了.本篇我们来看一下删除过程. 对于客户端来说,删除操作无需区分何种数据类型,只管进行 del 操作即可 ...