Python logging模块怎么使用,你会了吗?

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Python logging模块怎么使用,你会了吗?

image.png

Python logging模块使用

在开发和维护Python应用程序时,日志记录是一项非常重要的任务。Python提供了内置的logging模块,它可以帮助我们方便地记录应用程序的运行时信息、错误和调试信息。本文将介绍如何使用Python logging模块进行日志记录。

logging模块

logging是Python自带的用于记录程序运行日志的模块,它将日志分为5个等级,分别是:

  • DEBUG
  • INFO
  • WARNING
  • ERROR
  • CRITICAL

同时也可以将日志输出到控制台或者写入到日志文件中。

logging中的常用对象

  • Logger:日志记录器,是应用程序中可以直接使用的接口。
  • Handler:日志处理器,用以表明将日志保存到什么地方以及保存多久。
  • Formatter:格式化,用以配置日志的输出格式。

三者关系为,一个Logger 使用一个Handler,一个 Handler 使用一个 Formatter

日志输出到控制台

import logging

# 创建logger实例
logger = logging.getLogger('example')

# 设置日志级别
logger.setLevel(logging.DEBUG)

# 创建控制台处理器,将日志输出到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)

# 创建日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 将日志格式应用到处理器
console_handler.setFormatter(formatter)
# 将处理器添加到logger实例中
logger.addHandler(console_handler)

# 记录日志信息
logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')

运行代码,控制台输出如下:

2023-06-29 11:04:29,242 - example - DEBUG - debug
2023-06-29 11:04:29,242 - example - INFO - info
2023-06-29 11:04:29,242 - example - WARNING - warning
2023-06-29 11:04:29,242 - example - ERROR - error
2023-06-29 11:04:29,242 - example - CRITICAL - critical

日志输出到文件

更多时候,我们需要将日志保存起来,所以我们可以指定将日志输出到日志文件中,代码如下:

import logging

filename = "{}.log".format(__file__)
fmt = "%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s"

logging.basicConfig(
    level=logging.DEBUG,
    filename=filename,
    filemode="w",
    format=fmt
)

logging.info("info")
logging.debug("debug")
logging.warning("warning")
logging.error("error")
logging.critical("critical")

日志文件内容如下图:

image.png

同时输出到文件和控制台

import logging

# 创建logger对象
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)  # log等级总开关

# log输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")

# 控制台handler
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO) # log等级的开关
stream_handler.setFormatter(formatter)

# 文件handler
file_handler = logging.FileHandler("logging.log")
file_handler.setLevel(logging.WARNING) # log等级的开关
file_handler.setFormatter(formatter)

# 添加到logger
logger.addHandler(stream_handler)
logger.addHandler(file_handler)

# 输出日志
logger.info("info")
logger.debug("debug")
logger.warning("warning")
logger.error("error")
logger.critical("critical")

logging.conf配置文件

我们可以通过logging.conf来配置日志的输出,logging.conf名称是固定的。

[loggers]
keys = root

[handlers]
keys = logfile

[formatters]
keys = generic

[logger_root]
handlers = logfile

[handler_logfile]
class = handlers.TimedRotatingFileHandler
args = ('demo.log', 'midnight', 1, 10)
level = DEBUG
formatter = generic

[formatter_generic]
format = %(asctime)s %(levelname)-3.5s [%(name)s:%(lineno)s] %(message)s
import logging.config

logging.config.fileConfig('logging.conf')

logging.debug('debug message')
logging.info("info message")
logging.warning('warning message')
logging.error("error message")
logging.critical('critical message')

运行结果如下:

image.png

循环覆盖式日志处理

随着程序逐渐运行,日志规模会越来越大,我们就需要删除掉之前的日志,也可以设置单个日志的大小,当日志大小达到限定值时,会自动开始写入新的日志文件。

import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger("root")
# 设置logger等级
logger.setLevel(logging.DEBUG)

# 设置日志格式
formatter = logging.Formatter(
    fmt='%(asctime)s - %(pathname)s - %(name)s - %(levelname)s: - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S')

# 设置日志回滚  # 单个日志文件最大为1k,
# 最多保存4份日志文件(除了当前写入的文件外)
# 日志文件编码格式为utf-8
handler = RotatingFileHandler("logging.log", maxBytes=1024 * 1, backupCount=4, encoding='utf-8')
handler.setFormatter(formatter)

# 给logger添加handler
logger.addHandler(handler)

# 测试主模块
for i in range(100):
    logger.debug("测试日志main %d", i)

总结

通过使用Python的logging模块,我们可以方便地进行日志记录并获得应用程序的运行时信息。我们可以设置不同的日志级别,根据需要记录调试信息、警告、错误等。此外,我们还可以将日志记录到文件中,以供后续查看和分析。

使用logging模块进行日志记录可以帮助我们更好地理解应用程序的运行状况,并帮助我们快速定位和解决问题。建议在开发和维护Python应用程序时,充分利用logging模块进行日志记录。

相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
相关文章
|
5天前
|
运维 数据安全/隐私保护 Python
Python基于telnetlib模块实现交换机全面巡检自动化运维项目
Python基于telnetlib模块实现交换机全面巡检自动化运维项目
40 14
|
1天前
|
关系型数据库 数据处理 数据库
Python中的异步编程:理解asyncio模块及其应用
在现代编程中,异步编程变得越来越重要。Python中的asyncio模块为开发者提供了强大的工具,帮助他们利用异步编程模式来处理高并发和IO密集型任务。本文将深入探讨asyncio模块的核心概念、基本用法以及实际应用场景,帮助读者更好地理解和运用Python中的异步编程技术。
|
1天前
|
开发者 Python
确保你的Python环境中已经安装了`python-docx`模块。如果还没有安装,可以通过pip来安装:
确保你的Python环境中已经安装了`python-docx`模块。如果还没有安装,可以通过pip来安装:
8 1
|
3天前
|
物联网 Java 调度
Python中asyncio模块的实际使用
celery和asyncio写代码都差不多,但asycio用起来更简单,更适用于网络并发请求。如果用于做耗时任务处理也可以,针对如果耗时任务只有一个,明显用celery把耗时任务转到后台处理更为合适。
|
4天前
|
机器学习/深度学习 数据采集 安全
Python中的random模块及相关模块详解
随机函数是计算机科学中一个基础而又重要的概念,random模块为我们提供了丰富的功能来处理随机性。 通过深入学习和应用random模块以及numpy、secrets和matplotlib等相关模块,我们可以更好地处理各种随机性相关的问题。 无论是简单的随机数生成,还是复杂的随机分布和安全随机数,Python都为我们提供了强大的工具和库,使我们能够在各种应用场景中灵活应对随机性需求。
|
1天前
|
资源调度 计算机视觉 Python
`scipy.ndimage`是SciPy库中的一个子模块,它提供了许多用于处理n维数组(通常是图像)的函数。
`scipy.ndimage`是SciPy库中的一个子模块,它提供了许多用于处理n维数组(通常是图像)的函数。
6 0
|
1天前
|
Python
`scipy.signal`模块是SciPy库中的一个子模块,它提供了信号处理、滤波、频谱分析等功能。这个模块包含了许多用于信号处理的函数和类,其中`butter()`和`filtfilt()`是两个常用的函数。
`scipy.signal`模块是SciPy库中的一个子模块,它提供了信号处理、滤波、频谱分析等功能。这个模块包含了许多用于信号处理的函数和类,其中`butter()`和`filtfilt()`是两个常用的函数。
10 0
|
1天前
|
数据可视化 Python
时间序列分析是一种统计方法,用于分析随时间变化的数据序列。在金融、经济学、气象学等领域,时间序列分析被广泛用于预测未来趋势、检测异常值、理解周期性模式等。在Python中,`statsmodels`模块是一个强大的工具,用于执行各种时间序列分析任务。
时间序列分析是一种统计方法,用于分析随时间变化的数据序列。在金融、经济学、气象学等领域,时间序列分析被广泛用于预测未来趋势、检测异常值、理解周期性模式等。在Python中,`statsmodels`模块是一个强大的工具,用于执行各种时间序列分析任务。
7 0
|
1天前
|
API Python
首先,我们导入了`http.client`模块,它是Python标准库中的一个模块,用于创建和发送HTTP请求。
首先,我们导入了`http.client`模块,它是Python标准库中的一个模块,用于创建和发送HTTP请求。
5 0
|
1天前
|
存储 SQL Python
`urllib.parse`模块是Python标准库`urllib`中的一个子模块,它提供了处理URL(统一资源定位符)的实用功能。这些功能包括解析URL、组合URL、转义URL中的特殊字符等。
`urllib.parse`模块是Python标准库`urllib`中的一个子模块,它提供了处理URL(统一资源定位符)的实用功能。这些功能包括解析URL、组合URL、转义URL中的特殊字符等。
5 0