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")
日志文件内容如下图:
同时输出到文件和控制台
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')
运行结果如下:
循环覆盖式日志处理
随着程序逐渐运行,日志规模会越来越大,我们就需要删除掉之前的日志,也可以设置单个日志的大小,当日志大小达到限定值时,会自动开始写入新的日志文件。
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模块进行日志记录。
标签:logging,Python,message,handler,模块,debug,日志,logger From: https://blog.51cto.com/u_15640304/6985854