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

简介:

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

良好的日志是应用程序调试、质量跟踪的重要线索,因此在应用开发过程中应当养成良好的日志记录习惯。在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)
  • 1
参数 名称 解释
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模块是线程安全的。

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
3月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
485 7
|
3月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
328 0
|
3月前
|
JSON 算法 API
Python中的json模块:从基础到进阶的实用指南
本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
447 4
|
3月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
386 0
|
3月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
255 0
|
4月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
424 0
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
4127 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
8月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
911 57
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
418 9

推荐镜像

更多