Python logging模块使用配置文件记录日志

原创 2016年06月01日 09:35:51

良好的日志是应用程序调试、质量跟踪的重要线索,因此在应用开发过程中应当养成良好的日志记录习惯。在Python中内建了logging模块,可以使用该模块生成高质量的应用程序日志。

基本用法

默认情况下,logging将日志打印到屏幕,日志级别为WARNING;日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。

import logging

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

推荐用法

在项目中推荐使用按照时间的滚动日志记录方式,并使用配置文件进行日志记录配置。这样有很多好处:不会让日志文件无限变大,很容易实现保留最近N天日志的功能,需要修改日志记录规则直接改配置文件就好。按照时间滚动的日志需要使用TimedRotationHandler,其定义如下所示:

所谓按时间滚动意思是系统会在时间满足一定条件时给旧的日志文件存档,并仅保留一定时间内的日志,最终存档的日志文件名称类似:xx.log.2016-06-01。

class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)
参数 名称 解释
filename 文件名 在时间滚动模式中,它实际上代表文件名的前缀
when 时间 按照哪种时间单位滚动(可选s-按秒,m-按分钟,h-按小时,d-按天,w0-w6-按指定的星期几,midnight-在午夜)
interval 间隔 比如when设置为s,interval设置为1意思是每1秒
backupCount 备份数量 保存几份日志,系统会自动删除超出此数目的日志文件
encoding 编码 默认是UTF-8编码
delay 延迟写入 如果设置为True那么只有调用了emit()后才会写入文件。
utc 标准时间 设置为False(默认)使用本地时间,否则使用标准时间

配置文件

下面简单介绍一下配置文件中的要素。

设置按时间滚动

可以在log.conf文件中用下面的样式设置按时间滚动的handler。使用class指定handler,使用level指定使用此handler处理的日志级别,使用formatter指定此handler的日志格式,使用args传递参数,参数应该按上述定义的顺序写。

[handler_timedrt]
class=handlers.TimedRotatingFileHandler
level=INFO
formatter=form02
args=('myapp.log', 's', 1 , 10 )

设置HTTP

题外话:可以设置向HTTP服务器发送数据,通常在一个分布式的环境中,我们会选择实现一个HTTP接口用来接收来自各个网络组件的日志。

[handler_http]
class=handlers.HTTPHandler
level=NOTSET
formatter=form02
args=('localhost:9022', '/log', 'GET')

使用示例

可以使用下面的代码从配置文件中载入日志配置并进行日志记录。

import logging
import logging.config

logging.config.fileConfig("logger.conf")
logger = logging.getLogger("example01")

logger.debug('This is debug message')
logger.info('This is info message')
logger.warning('This is warning message')

在工程中的实践

下面我们来看看如何在实际的工程中按照推荐的用法使用logging模块。在工程中,我推荐使用下面这种结构:

--lib
  |--class1.py
  |--class2.py
--config.py
--main.py
--logger.conf

工程中我们使用一个名字为config.py的Python模块用来保存全局的配置,由于logging在工程中每个源代码文件都可能用到,因此我们把logging模块在config.py中生成一个实例,这样其它模块只需要引用这个实例就可以了。

import logging
import logging.config
from pymongo import MongoClient

config = {    "key1":"value1"     }

logging.config.fileConfig("logger.conf")
logger = logging.getLogger("cse")

在其它模块中,我们使用这样的语句引用logger对象:

from config import logger

需要记录日志的时候,只需要使用logger.error,logger.debug类似的语句就好了。

完整的logger.conf

下面是一个完整的logger.conf文件示例,它默认为会将日志存储在当前目录的log目录下,会将ERROR及以上级别的日志通过POST请求发送到http://localhost:8087/api/v1.0/log。请根据需要自行修改。

#logger.conf

###############################################

[loggers]
keys=root,cse

[logger_root]
level=DEBUG
handlers=stream

[logger_cse]
handlers=stream,timedrt,http
qualname=cse
propagate=0

###############################################

[handlers]
keys=stream,timedrt,http

[handler_stream]
class=StreamHandler
level=NOTSET
formatter=form01
args=(sys.stderr,)

[handler_filert]
class=handlers.RotatingFileHandler
level=INFO
formatter=form02
args=('log/cse.log', 'a', 10*1024*1024, 5)

[handler_timedrt]
class=handlers.TimedRotatingFileHandler
level=DEBUG
formatter=form01
args=('log/cse.log', 'd', 1 , 10 )

[handler_http]
class=handlers.HTTPHandler
level=ERROR
formatter=form01
args=('localhost:8087', '/api/v1.0/log', 'POST')


###############################################

[formatters]
keys=form01,form02

[formatter_form01]
format=[%(asctime)s][%(filename)s][line:%(lineno)d][%(levelname)s] %(message)s
datefmt=%a, %d %b %Y %H:%M:%S

[formatter_form02]
format=%(name)-12s: %(levelname)-8s %(message)s
datefmt=

值得一提的是,logging模块是线程安全的。

参考文档

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

python 日志模块logging学习与使用(日志分割)

在日常项目中,总是需要记录下一些细小信息或者错误码、错误信息的,这个时候就需要进行日志的操作。 python中用于日志创建、设置和记录等功能的模块,就是logging了,下面是对其基本使...

python logging模块的多文件应用

概述 有的时候需要在一个python程序中生成多个log文件。 本文对logging进一步封装,展示如何在一个程序中使用logging模块打印两个log文件来记录不同类型的信息。 注意loggi...

Python中logging.config配置文件解读

Python中logging.config配置文件解读 下面的函数用于配置logging模块,它们位于logging.config模块中。你可以使用这些函数来配置,也可以在logging或是...

当我们在使用Flask时,如何如记录日志

我们在开发基于Flask的Web应用时,往往容易忽略了对日志的使用,而在Flask的官方文档中,对日志这块的介绍也仅仅停留在如何与系统集成上。记录日志这个看似很简单的事情,在实际中很多人却不一定能做好...

Flask成长笔记--如何在Flask框架里面读写文本文件

我想在Flask中读取日志的文本文件,然后将读取的信息显示到网页上去形成一个管理的网页。真的是为了解决这个问题,要了半条命啊!特意记下了。 参考:https://stackoverflow.com/...

【Flask】在Flask中使用logger

使用Flask的logger时无法使用app.logger的一个解决方案。

python logging 日志详细配置

转载自伯乐在线 http://python.jobbole.com/81666/ 谢谢这位大哥的详细翻译在现实生活中,记录日志非常重要。银行转账时会有转账记录;飞机飞行过程中,会有黑盒子(飞行数据记...

Python logging模块详解

简单将日志打印到屏幕: import logging logging.debug('debug message') logging.info('info message') logging.warn...

python日志输出—logging配置文件

一、logging直接写在代码中       >>>http://blog.csdn.net/naiveloafer/article/details/7630673 二、通过配置文件来配置输出...

使用Python的logging.config

如果使用Python写一个比较大型的程序,你一定会用上日志系统。特别是Python这样的动态语言,很多错误都只能在运行的时候才能发现,一个好的日志系统对于Python程序相当重要。最简单的解决方案当然...
  • zgl_dm
  • zgl_dm
  • 2013-06-29 16:00
  • 17561
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)