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. 「Luogu P3395」路障 解题报告

    点开有惊喜 其实是题面 这D1T1给的很有面子! 我居然做的来! 从左上角走到右上角 然后n<=1000 所以果断放弃DFS,选择BFS 思路还是一样的BFS 证明: 走到一个点的时间越早越好( ...

  2. PostgreSQL基础操作

    1. 查看版本信息 1.1 查看客户端版本信息 黑窗口中输入:psql --version(有两条横线) 没有配置全局的环境变量时,就只能在PostgreSQL安装目录的bin目录中打开黑窗口执行该命 ...

  3. TVP思享 | 四个全新维度,极限优化HTTP性能

    导语 | 当产品的用户量不断翻番时,需求会倒逼着你优化HTTP协议.那么,要想极限优化HTTP性能,应该从哪些维度出发呢?本文将由TVP陶辉老师,为大家分享四个全新维度.「TVP思享」专栏,凝结大咖思 ...

  4. 搭建nginx

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的R ...

  5. Java扫描指定文件路径下的文件并且递归扫描其子目录下的所有文件

    本文主要实现了扫描指定文件路径下的文件,递归扫描其子目录下的所有文件信息,示例文件为: 要求将后缀为.dat的文件夹信息也写入到数据库中,然后将.chk文件解析,将文件中对应的内容读出来写入到数据库, ...

  6. 【一起学源码-微服务】Hystrix 源码一:Hystrix基础原理与Demo搭建

    说明 原创不易,如若转载 请标明来源! 欢迎关注本人微信公众号:壹枝花算不算浪漫 更多内容也可查看本人博客:一枝花算不算浪漫 前言 前情回顾 上一个系列文章讲解了Feign的源码,主要是Feign动态 ...

  7. 从零开发一款txt小说下载器

    在日常开发中,列表是一个非常常用的一个东西,可以用listview和recyclerview实现.当然,由于recyclerview更为实用且强大,它也是更好的方案. 而我以前为了方便,习惯直接拿网上 ...

  8. 图解kubernetes调度器预选设计实现学习

    Scheduler中在进行node选举的时候会首先进行一轮预选流程,即从当前集群中选择一批node节点,本文主要分析k8s在预选流程上一些优秀的筛选设计思想,欢迎大佬们指正 1. 基础设计 1.1 预 ...

  9. 1.PL/SQL Developer的快捷键

    设置步骤: Configure  =>  preference => 用户界面 => 编辑器  => 自动替换 => 启用 => 编辑 =>保存(产生一个文件 ...

  10. LCA - 求任意两点间的距离

    There are n houses in the village and some bidirectional roads connecting them. Every day peole alwa ...