本文仅仅简单介绍了Python中日志输出管理。
日志:跟踪程序运行时发生事件
DEBUG:详细信息,通常用于诊断问题。当程序运行时,DEBUG级别的日志会记录程序执行的详细信息,对开发调试非常有用。(详细信息)
INFO:确认程序按预期运行。INFO级别的日志用来记录程序正常运行过程中的一些重要事件信息,但不涉及细节。(重要程序信息)
WARNING:表明发生了意外,或者表明在不久的将来可能会出现潜在的问题。但是程序仍然可以正常工作。这类日志通常用于提醒开发者或维护者注意某些不太正常的情况。(存在不影响正常工作的不正常)
ERROR:由于更严重的问题,软件无法执行一些功能。ERROR级别的日志用于记录程序运行时出现的错误,这些错误会导致程序的部分功能无法正常执行。(存在影响正常工作的不正常)
CRITICAL:严重错误,表明程序本身可能无法继续运行。这是最严重的日志级别,表明程序遭遇了致命错误,需要立即采取措施。(严重错误信息)
Logger是日志系统的入口点。它暴露了应用程序代码可以直接使用的接口。每个Logger都有一个名字,这个名字在配置日志和过滤日志时使用。
Logger可以完成以下功能:
向应用程序代码暴露几个方法,如debug(), info(), warning(), error()和critical(),用于记录相应级别的日志。
基于日志级别和过滤器,决定是否传递日志记录给Handler。
Logger可以具有层级关系,子Logger会继承父Logger的设置。
Handler负责发送日志消息到适当的目的地,比如控制台、文件、HTTP服务器等。每个Logger都可以有多个Handler,而每个Handler可以有不同的日志级别和格式化器。
Handler的几个常见类型包括:
StreamHandler:将日志输出到流,如sys.stdout、sys.stderr或任何类似文件的对象。
FileHandler:将日志输出到磁盘文件。
SocketHandler:将日志发送到TCP/IP套接字。
SMTPHandler:将日志发送到指定的电子邮件地址。
Formatter用于指定日志记录的最终输出格式。每个Handler都可以有自己的Formatter,它定义了日志记录的布局。Formatter通常使用以下信息来格式化日志消息:
时间戳(%(asctime)s)
日志级别(%(levelname)s)
Logger的名字(%(name)s)
日志消息(%(message)s)
进程ID(%(process)d)
线程ID(%(thread)d)
例如,一个简单的Formatter配置可能如下所示:
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
Level决定了Logger和Handler应该处理哪些日志消息。每个日志记录请求都有一个级别,Logger和Handler都设置了级别阈值,只有当请求的级别等于或高于阈值时,日志记录才会被处理。
以下是标准的日志级别:
DEBUG: 最详细的日志信息,用于诊断问题。(详细信息)
INFO: 确认程序按预期运行。(重要程序信息)
WARNING: 表明发生了意外,或表明在不久的将来可能会出现潜在的问题。(存在不影响正常运行的不正常)
ERROR: 由于更严重的问题,软件无法执行一些功能。(存在影响正常运行的不正常)
CRITICAL: 严重错误,表明程序本身可能无法继续运行。(严重错误信息)
import logging
from logging.handlers import RotatingFileHandler
def setup_logger(log_file, log_level=logging.INFO):
# 创建一个logger
logger = logging.getLogger('MyLogger')
logger.setLevel(log_level)
# 创建一个handler,用于写入日志文件
file_handler = RotatingFileHandler(log_file, maxBytes=1024*1024*5, backupCount=5)
file_handler.setLevel(log_level)
# 创建一个handler,用于将日志输出到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(log_level)
# 创建一个formatter,用于定义日志的格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 添加formatter到handler
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 添加handler到logger
logger.addHandler(file_handler)
logger.addHandler(console_handler)
return logger
if __name__ == "__main__":
# 设置日志文件路径和日志级别
log_file_path = 'myapp.log'
logger = setup_logger(log_file_path, logging.DEBUG)
# 使用logger记录不同级别的日志
logger.debug("This is a debug message.")
logger.info("This is an info message.")
logger.warning("This is a warning message.")
logger.error("This is an error message.")
logger.critical("This is a critical message.")
当使用RotatingFileHandler时,日志信息会被写入到一个指定的文件中。一旦这个文件的大小达到设定的阈值(通过maxBytes参数指定)
RotatingFileHandler就会进行以下操作:
关闭当前正在写入的日志文件。
将当前日志文件重命名,通常是添加一个序号或者时间戳来区分。
创建一个新的日志文件,继续写入新的日志信息。
这个过程称为“轮转”。
以上就是今天要讲的内容,本文仅仅简单介绍了Python中日志输出管理。