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

[formatters]
# 定义格式化输出

[logger_root]

# 实现上面定义的logger模块,必需是[logger_xxxx]这样的形式

# [logger_xxxx] logger_模块名称
# level 级别,级别有DEBUG、INFO、WARNING、ERROR、CRITICAL
# handlers 处理类,可以有多个,用逗号分开
# qualname logger名称,应用程序通过 logging.getLogger获取。对于不能获取的名称,则记录到root模块。
# propagate 是否继承父类的log信息,0:否 1:是

[handler_infohandler]# [handler_xxxx]# class handler类名# level 日志级别# formatter,上面定义的formatter# args handler初始化函数参数

[formatter_form01]

# 日志格式#--------------------------------------------------# %(asctime)s       年-月-日 时-分-秒,毫秒 2013-04-26 20:10:43,745# %(filename)s      文件名,不含目录# %(pathname)s      目录名,完整路径# %(funcName)s      函数名# %(levelname)s     级别名# %(lineno)d        行号# %(module)s        模块名# %(message)s       消息体# %(name)s          日志模块名# %(process)d       进程id# %(processName)s   进程名# %(thread)d        线程id# %(threadName)s    线程名
 

原文地址:https://www.cnblogs.com/xiaohuhu/p/9085749.html

时间: 2024-11-08 17:56:17

Python logging模块使用配置文件记录日志的相关文章

python logging模块 basicConfig配置文件

logging.basicConfig(level=log_level, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='parser_result.log', filemode='w') logging.basicConfig函数各参数: filename: 指定日志文件名 filemode: 和fil

Python logging模块日志存储位置踩坑

问题描述 项目过程中写了一个小模块,设计到了日志存储的问题,结果发现了个小问题. 代码结构如下: db.py run.py 其中db.py是操作数据库抽象出来的一个类,run.py是业务逻辑代码.两个文件中都有使用Python自带的logging模块,来记录日志.其中前者将日志存入到db_xxx.log下,后者存入run_xxx.log下. 两者logging相关代码为: # db.py import logging import time dt = time.time() logging.ba

Python logging模块实例教程

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

python logging模块使用

近来再弄一个小项目,已经到收尾阶段了.希望加入写log机制来增加程序出错后的判断分析.尝试使用了python logging模块. #-*- coding:utf-8 -*- import logging import sys class LogRecord(object): def __init__(self): self.mylogger = logging.getLogger('iplog') self.mylogger.setLevel(logging.WARNING) #创建一个han

python logging模块可能会令人困惑的地方

python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调用,而每个文件设置了对应的logging方式不同,可能会产生的令人困惑的现象. 下面以自己在开发的时候遇到的问题作为叙述的背景: 有三个python模块A.B.C.主模块A会import B和C模块,主模块有对应的logging方式, A使用logging的模块的方式为: import loggin

python logging模块小记

1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message') 屏幕上打印: WARNING:root:This is warning message 默认情况下,logging将日志打印到屏幕,日志级别为WARNING:日志级别大小关系为:CRITICAL > ER

python logging—模块

python logging模块 python logging提供了标准的日志接口,python logging日志分为5个等级: debug(), info(), warning(), error() and critical() 简单用法 import logging logging.warning("warning.........") logging.critical("server is down") print: WARNING:root:warning

读懂掌握 Python logging 模块源码 (附带一些 example)

搜了一下自己的 Blog 一直缺乏一篇 Python logging 模块的深度使用的文章.其实这个模块非常常用,也有非常多的滥用.所以看看源码来详细记录一篇属于 logging 模块的文章. continue Reference: https://juejin.im/post/5b13fdd0f265da6e0b6ff3dd  Pycon2018 利用logging模块轻松地进行Python日志记录 原文地址:https://www.cnblogs.com/piperck/p/9634133.

python logging模块使用教程

简单使用 #!/usr/local/bin/python # -*- coding:utf-8 -*- import logging logging.debug('debug message') logging.info('info message') logging.warn('warn message') logging.error('error message') logging.critical('critical message') 输出: WARNING:root:warn mess