前言

在应用中记录日志是程序开发的重要一环,也是调试的重要工具。但却很容易让人忽略。之前用flask写的一个服务就因为没有处理好日志的问题导致线上的错误难以察觉,修复错误的定位也很困难。最近恰好有时间可以梳理一下python日志的功能,下面是一点笔记。

使用

python标准库中提供了记录日志的方案。

import logging
from logging.config import dictConfig logger = logging.getLogger(__name__) # 定义格式
formatter = logging.Formatter(fmt='%(asctime)s %(name)-12s %(levelname)-8s %(message)s') # 定义日志处理器
streamHdl = logging.StreamHandler() # 设定日志级别
streamHdl.setLevel(logging.DEBUG) # 设定日志格式
streamHdl.setFormatter(formatter) # 给日志器添加日志处理器
logger.addHandler(streamHdl) # 记录日志
logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()

从上面的演示这个模块的使用是比较简单的。但在应用中深入使用有些需要注意的地方:

parent logger / child logger

在多模块程序中使用多个模块是很常见的,被引用模块中的日志对象容易让人迷惑。我们知道一个应用有一个唯一的文件入口,如果这个入口文件中定义了logger,那这个logger就是parent logger, 其中被导入的模块中定义的logger就是child logger, 与我们常见的在一个模块中实例化使用不同,在每一个需要记录日志的地方都需要产生一个logger,然后进行日志记录操作。每个模块内部所记录的日志根据每个logger的配置信息对日志进行操作,然后根据该logger是否反向传递到parent logger进一步操作。反向传递到parent logger之后,依旧像普通的logger一样对日志进行处理。

日志的配置

https://docs.python.org/3/howto/logging.html#configuring-logging

每个logger都可以通过ini文件、yarm文件、对象等形式进行配置,这里主要讲以字典形式进行的配置。


logging_config = dict(
version=1,
formatters={
'f': {'format':
'%(asctime)s000000 %(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)

当在一个文件中使用dictConfig,就给该文件的logger定义了配置。

异常的捕捉

logger.error()与logger.exception()之间的区别在于error()只会打印一句话,而exception()则会将异常的错误栈都会打印出来。对于出现代码异常的地方,可以使用exception()用作记录。

普通日志直接使用logging模块来记录,应用内不处理日志的去向,作为事件流统一输出到标准输出,采用第三方日志采集工具进行捕获和处理。但也不能太绝对,如果外部收集日志的程序缺少对日志级别分类,或者对异常记录缺少必要的支持,就需要内置的模块进行处理。

常用的内置handler

    https://docs.python.org/3/howto/logging.html#useful-handlers

参考

https://12factor.net/logs

https://docs.python.org/3/howto/logging.html

https://docs.python.org/3/howto/logging-cookbook.html

python日志模块笔记的更多相关文章

  1. python日志模块logging

    python日志模块logging   1. 基础用法 python提供了一个标准的日志接口,就是logging模块.日志级别有DEBUG.INFO.WARNING.ERROR.CRITICAL五种( ...

  2. python日志模块

    许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系 统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net,c++中,有人们熟悉的log4c ...

  3. Python 日志模块实例

    python 打印对象的所有属性值: def prn_obj(obj):     print '\n'.join(['%s:%s' % item for item in obj.__dict__.it ...

  4. Python日志模块logging用法

    1.日志级别 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL. DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 ...

  5. python日志模块的使用

    学习一下python的日志模块logging,可以参考如下博客,写得很详细 https://www.cnblogs.com/yyds/p/6901864.html https://www.cnblog ...

  6. python日志模块logging学习

    介绍 Python本身带有logging模块,其默认支持直接输出到控制台(屏幕),或者通过配置输出到文件中.同时支持TCP.HTTP.GET/POST.SMTP.Socket等协议,将日志信息发送到网 ...

  7. Python 日志模块详解

    前言 我们知道查看日志是开发人员日常获取信息.排查异常.发现问题的最好途径,日志记录中通常会标记有异常产生的原因.发生时间.具体错误行数等信息,这极大的节省了我们的排查时间,无形中提高了编码效率.所以 ...

  8. Python日志模块的管理(二)

    日志模块可以通过封装一个类,也可以通过配置文件取管理 新建1个log.ini文件 [loggers] keys=root [handlers] keys=fileHandler,streamHandl ...

  9. Python 日志模块 logging通过配置文件方式使用

    vim logger_config.ini[loggers]keys=root,infoLogger,errorlogger [logger_root]level=DEBUGhandlers=info ...

随机推荐

  1. DCGAN: "Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Network" Notes

    - Alec Radford, ICLR2016 原文:https://arxiv.org/abs/1511.06434 论文翻译:https://www.cnblogs.com/lyrichu/p/ ...

  2. java获得采集网页内容的方法小结

          为了写一个java的采集程序,从网上学习到3种方法可以获取单个网页内容的方法,主要是运用到是java IO流方面的知识,对其不熟悉,因此写个小结. import java.io.Buffe ...

  3. 软工实践 - 第二十六次作业 Beta 冲刺(4/7)

    队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10124816.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过 ...

  4. 【翻译】ASP.NET Core 入门

    ASP.NET Core 入门 原文地址:Introduction to ASP.NET Core         译文地址:asp.net core 简介           翻译:ganqiyin ...

  5. 如何创建LocalDB数据库和数据库实例

    LocalDB是SQL Server 2012带来的新特性,它是一个专门为开发人员量身定制的轻量级数据库,下面介绍如何使用它. 创建LocalDB数据库的方法: 打开服务器资源管理器,右键点击“数据连 ...

  6. 【bzoj1086】[SCOI2005]王室联邦 树分块

    题目描述 将一棵n个点的树分为若干“块”,每个块满足:大小在B到3B之间,并且这个“块”添加某个点后连通.求方案. 输入 第一行包含两个数N,B(1<=N<=1000, 1 <= B ...

  7. JQuery事件对象的属性和方法

    这是今天的总结,以后学习自己可以当参考书来读读.Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态.事件通常与函数结合使用,函数不会在事件发生前被执行 ...

  8. Java操作Redis存储对象类型数据

    背景描述      关于JAVA去操作Redis时,如何存储一个对象的数据,大家是非常关心的问题,虽然官方提供了存储String,List,Set等等类型,但并不满足我们现在实际应用.存储一个对象是是 ...

  9. Codeforces 937.B Vile Grasshoppers

    B. Vile Grasshoppers time limit per test 1 second memory limit per test 256 megabytes input standard ...

  10. istringstream()函数的用法

    istringstream()函数的用法 头文件:#include 功能:将一个含有多个空格的字符串分割开来 eg: