Python logging不输出到控制台

在Python中,logging是一个非常有用的模块,可以帮助我们记录程序运行时的信息,方便调试和排查问题。通常情况下,我们会将日志信息输出到控制台和日志文件中。但有时候,我们可能希望将日志信息只输出到日志文件中,而不在控制台打印。本文将介绍如何实现这一目标。

logging模块简介

Python的logging模块提供了一个灵活的框架来记录日志信息。通过配置logger、handler和formatter,我们可以灵活地控制日志的输出格式、输出位置等。logging模块提供了5个日志级别:DEBUG、INFO、WARNING、ERROR和CRITICAL,分别对应不同的严重程度。我们可以根据需要设置日志级别,只记录特定级别及以上的日志信息。

下面我们来看一个简单的示例代码,演示如何创建一个logger对象,并将日志信息同时输出到控制台和日志文件中。

import logging

# 创建logger对象
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# 创建一个文件handler,用于写入日志文件
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.DEBUG)

# 创建一个控制台handler,用于在控制台输出日志信息
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)

# 创建一个简单的formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)

# 将handler添加到logger对象中
logger.addHandler(file_handler)
logger.addHandler(stream_handler)

# 记录日志信息
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')

上面的代码创建了一个logger对象,并配置了一个文件handler和一个控制台handler。日志信息会同时输出到文件'example.log'和控制台中。接下来,我们将介绍如何让日志信息只输出到文件中,而不在控制台打印。

不输出到控制台

要实现日志信息只输出到文件中,不在控制台打印,我们需要对控制台handler进行设置。我们可以通过设置控制台handler的级别为一个比DEBUG级别更高的级别,比如ERROR或CRITICAL。这样,控制台handler就不会打印DEBUG或INFO级别的日志信息。

下面是修改后的代码示例:

import logging

# 创建logger对象
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# 创建一个文件handler,用于写入日志文件
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.DEBUG)

# 创建一个控制台handler,用于在控制台输出日志信息
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.ERROR)  # 设置级别为ERROR

# 创建一个简单的formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)

# 将handler添加到logger对象中
logger.addHandler(file_handler)
logger.addHandler(stream_handler)

# 记录日志信息
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')

在上面的代码中,我们将控制台handler的级别设置为ERROR,这样只有ERROR和CRITICAL级别的日志信息会被输出到控制台,而DEBUG和INFO级别的日志信息不会输出到控制台。

通过以上方法,我们可以轻松地实现将日志信息只输出到文件中,而不在控制台打印。这对于需要保持控制台干净的场景非常有用,比如在生产环境中记录日志时。

类图

下面是一个简单的logging模块的类图,展示了logger、handler和formatter之间的关系。

classDiagram
    class Logger {
        - name