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. Django 单表查询

    前言 如何只单独测试django中的某一个py文件呢?或者说如何书写测试脚本? 我们可以在任意一个py文件(应用下的tests或者自己新建一个)中书写以下代码: 前期准备 创建一个电影表 class ...

  2. AES中ECB模式的加密与解密(Python3.7)

    本文主要解决的问题 本文主要是讲解AES加密算法中的ECB模式的加密解密的Python3.7实现.具体AES加密算法的原理这里不做过多介绍,想了解的可以参考文末的参考链接. 主要解决了两个问题: 在P ...

  3. EntityFramework Core表名原理解析,让我来,揭开你神秘的面纱

    前言 上一节我们针对最开始抛出的异常只是进行了浅尝辄止的解析,是不是有点意犹未尽的感觉,是的,我也有这种感觉,看到这里相信您和我会有一些疑惑,要是我们接下来通过注解.Fluent APi.DbSet分 ...

  4. Java8 通关攻略

    点赞+收藏 就学会系列,文章收录在 GitHub JavaEgg ,N线互联网开发必备技能兵器谱 Java8早在2014年3月就发布了,还不得全面了解下 本文是用我拙劣的英文和不要脸的这抄抄那抄抄,熬 ...

  5. Scala与Mongodb实践4-----数据库操具体应用

    目的:在实践3中搭建了运算环境,这里学会如何使用该环境进行具体的运算和相关的排序组合等. 由数据库mongodb操作如find,aggregate等可知它们的返回类型是FindObservable.A ...

  6. SPFA判负环模板

    void DFS_SPFA(int u){   if(flag) return; vis[u]=true;   for(int i=head[u];i;i=edges[i].nxt){   if(fl ...

  7. 借助 dp 公式去优化

    题目描述 一天,神犇和 LCR 在玩扑克牌.他们玩的是一种叫做“接竹竿”的游戏. 游戏规则是:一共有 nnn 张牌,每张牌上有一个花色 ccc 和一个点数 vvv,花色不超过 kkk 种.将这些牌依次 ...

  8. Python工具类(二)—— 操作时间相关

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ __title__ = '操作时间的工具类' "" ...

  9. .NET Core验证ASP.NET密码

    .NET Core验证ASP.NET密码 随着.NET Core的持续更新和完善,越来越多的机构已经选择或者升级为.NET Core.但由于技术不完全相同,不可能所有应用/数据库都能无缝迁移,因此AS ...

  10. 解决python爬虫requests.exceptions.SSLError: HTTPSConnectionPool(host='XXX', port=443)问题

    爬虫时报错如下: requests.exceptions.SSLError: HTTPSConnectionPool(host='某某某网站', port=443): Max retries exce ...