python 文件修改记录_Python logging模块使用配置文件记录日志

推荐用法

在项目中推荐使用按照时间的滚动日志记录方式,并使用配置文件进行日志记录配置。这样有很多好处:不会让日志文件无限变大,很容易实现保留最近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=

字段说明:[loggers]

# 定义logger模块,root是父类,必需存在的,其它的是自定义。

# logging.getLogger(NAME)便相当于向logging模块注册了一种日志打印

# name 中用. 表示log 的继承关系[handlers]

# 定义handler

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值