Python的logging模块通过分级管理、多目标输出和结构化格式,提供比print更专业、灵活的日志解决方案,适用于从简单脚本到大型项目的各类应用场景。

Python的
logging
要开始使用
logging
basicConfig
StreamHandler
import logging
# 配置日志系统:
# level=logging.INFO 设置了日志的最低级别,低于INFO的日志(如DEBUG)将不会被处理。
# format 定义了日志的输出格式,这里包含了时间、级别、日志名和消息。
# filename='app.log' 将日志输出到文件,而不是默认的控制台。
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',
filename='app.log',
filemode='a') # 'a'表示追加模式,'w'表示覆盖模式
# 获取一个日志器实例,通常推荐使用模块名作为日志器名称
logger = logging.getLogger(__name__)
# 使用不同级别的日志记录消息
logger.debug("这是一条调试信息,如果level是INFO,它将不会被记录。")
logger.info("程序启动了,一切正常。")
logger.warning("发现一个潜在的问题,但程序可以继续运行。")
logger.error("发生了一个错误,需要注意。")
logger.critical("发生了严重错误,程序可能无法继续运行!")
# 如果想同时输出到控制台,需要添加一个StreamHandler
# 这种情况下,basicConfig就不能直接设置所有东西了,需要更细致的配置
# 下面会详细解释这段代码执行后,你会在当前目录下找到一个名为
app.log
basicConfig
Logger
Handler
Formatter
logging
我个人觉得,当你开始写超过几十行的脚本,或者任何打算在生产环境运行的代码时,
logging
立即学习“Python免费学习笔记(深入)”;
logging
DEBUG
INFO
WARNING
ERROR
CRITICAL
DEBUG
INFO
WARNING
logging
logging
ERROR
所以,与其说
logging
当
basicConfig
logging
Logger
Handler
Formatter
一个
Logger
Handler
Formatter
import logging
# 1. 创建一个日志器实例
# 通常推荐使用__name__作为日志器的名称,这样可以创建分层的日志器
logger = logging.getLogger('my_app')
logger.setLevel(logging.DEBUG) # 设置日志器的最低处理级别
# 2. 创建一个控制台处理器 (StreamHandler)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO) # 控制台只输出INFO及以上级别的日志
# 3. 创建一个文件处理器 (FileHandler)
file_handler = logging.FileHandler('detailed_app.log', mode='a', encoding='utf-8')
file_handler.setLevel(logging.DEBUG) # 文件中记录所有DEBUG及以上级别的日志
# 4. 定义日志的格式器
# console_formatter 用于控制台,可以简洁一些
console_formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
# file_formatter 用于文件,可以包含更多细节
file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')
# 5. 将格式器添加到处理器
console_handler.setFormatter(console_formatter)
file_handler.setFormatter(file_formatter)
# 6. 将处理器添加到日志器
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 尝试记录一些日志
logger.debug("这条调试信息只会出现在文件中。")
logger.info("程序正在执行关键步骤。")
logger.warning("发现一个配置问题。")
logger.error("一个严重的错误发生了,堆栈信息:", exc_info=True) # exc_info=True 会自动捕获异常信息这段代码展示了如何为同一个
Logger
Handler
Handler
DEBUG
INFO
exc_info=True
在大型项目中,日志的混乱是一个常见问题。不同的模块、不同的功能可能需要独立的日志输出策略,如果所有日志都混在一起,排查问题就成了大海捞针。Python的
logging
当你调用
logging.getLogger(name)
.
logging.getLogger('my_app.module_a')logging.getLogger('my_app')关键点:
按模块命名日志器:最佳实践是在每个模块中都通过
logger = logging.getLogger(__name__)
__name__
my_package.my_module
my_app.database
日志传播(Propagation):子日志器发出的日志信息,默认情况下会“传播”到其父日志器,直到根日志器。这意味着,如果你在根日志器上配置了处理器,那么所有子日志器的日志都会经过这个处理器。
让我们看一个例子:
# main.py
import logging
import my_module
# 配置根日志器(或者一个顶层日志器)
root_logger = logging.getLogger() # 获取根日志器
root_logger.setLevel(logging.INFO)
# 创建一个文件处理器,用于记录所有INFO及以上级别的日志
file_handler = logging.FileHandler('project_logs.log')
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
root_logger.addHandler(file_handler)
# 创建一个控制台处理器,只输出WARNING及以上级别到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.WARNING)
console_handler.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))
root_logger.addHandler(console_handler)
# 获取主应用的日志器
app_logger = logging.getLogger('my_app')
app_logger.info("主应用启动中...")
app_logger.debug("这条DEBUG信息不会被根日志器处理,因为根日志器的level是INFO。") # 不会被记录到文件或控制台
# 调用模块中的函数
my_module.do_something()
# my_module.py
import logging
# 获取当前模块的日志器,它会是'my_module'这个名字
module_logger = logging.getLogger(__name__) # 这里的__name__就是'my_module'
module_logger.setLevel(logging.DEBUG) # 模块内部可以设置更低的级别,但最终会受父日志器限制
def do_something():
module_logger.debug("my_module: 正在执行一些内部操作...")
module_logger.info("my_module: 关键步骤完成。")
try:
1 / 0
except ZeroDivisionError:
module_logger.error("my_module: 发生了除零错误!", exc_info=True)在这个例子中:
main.py
app_logger
my_app
my_module.py
module_logger
my_module
root_logger
my_module
DEBUG
"my_module: 正在执行一些内部操作..."
module_logger
root_logger
root_logger
INFO
DEBUG
INFO
ERROR
root_logger
file_handler
ERROR
console_handler
通过这种层级结构和传播机制,你可以为整个应用程序设置一个通用的日志策略,同时允许特定模块在需要时记录更详细(或更少)的信息。如果某个子日志器不需要将日志传播给父日志器,可以设置
logger.propagate = False
以上就是python中如何使用logging模块记录日志?的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号