在 Python 中将消息记录到文件和控制台

Subodh Adhikari 2023年1月30日 2021年10月2日
  1. 在 Python 中使用 logging 模块向文件和控制台打印日志信息
  2. 在 Python 中使用 logging 模块向文件和控制台打印日志信息
  3. 在 Python 中使用 logging 模块将日志消息打印到文件
在 Python 中将消息记录到文件和控制台

本教程将介绍一些在 Python 中将调试字符串记录到文件和控制台的方法。

在 Python 中使用 logging 模块向文件和控制台打印日志信息

日志记录是记录系统中发生的各种事件的过程。这些事件可以是输入数据、进程、线程、输出数据、处理过的信息、错误、警告、通知。各种事件被跟踪并存储在日志文件中。logging 模块由 Python 提供,便于程序员记录发生的各种事件。该模块具有特定的类和方法。LoggersHandlersFiltersFormatterslogging 模块定义的基本类。

basicConfig() 方法执行基本配置。它使用默认的 Formatter 创建一个 StreamHandler。然后,它添加到根记录器。日志记录级别以数值表示。有六个日志记录级别:CRITICALERRORWARNINGINFODEBUGNOTSET。我们已将日志记录级别设置为下方的 INFO。因此,将显示或存储 INFOWARNINGERRORCRITICAL

要写入控制台和文件,我们将使用 logging.basicConfig(),它可以采用参数处理程序并大大简化日志记录设置,尤其是在使用相同的格式化程序设置多个处理程序时。我们使用 FileHandler() 方法写入文件并使用 debug.log 记录所有信息。同样,要写入控制台,我们使用 StreamHandler()。默认情况下,StreamHandler() 写入标准错误。要写入标准输出,我们导入 sys 模块并将 sys.stdout 显式传递给 StreamHandler()

在下面的示例中,日志打印在控制台和文件 debug.log 中。

#python 3.x
import logging
import sys

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler("debug.log"),
        logging.StreamHandler(sys.stdout)
    ]
)
logging.debug('This message is skipped as a level is set as INFO')
logging.info('So should this')
logging.warning('And this, too')
logging.error('Testing non-ASCII character, Ø and ö')

输出:

2021-07-28 14:50:01,348 [INFO] So should this
2021-07-28 14:50:01,349 [WARNING] And this, too
2021-07-28 14:50:01,349 [ERROR] Testing non-ASCII character, Ø and ö

在 Python 中使用 logging 模块向文件和控制台打印日志信息

要使用日志记录并设置基本配置,我们使用 logging.basicConfig()。然后,我们不使用 print(),而是调用 logging.{level}(message) 在控制台中显示消息。由于我们在 basicConfig() 设置中将级别配置为 INFO,我们稍后在程序中调用了 logging.info()。并将字符串中的整个消息传递给 logging.info(),然后将其显示到控制台。

示例代码:

#python 3.x
import logging
logging.basicConfig(level=logging.INFO)

def area(l, b):
    """Compute the area of a rectangle"""
    return l*b
logging.info("Area of length: {l} and breadth: {b} is {c}".format(l=3, b=4, c=area(l=3,b=4)))

输出:

INFO:root:Area of length: 3 and breadth: 4 is 12

在 Python 中使用 logging 模块将日志消息打印到文件

如果我们在一个程序中使用多个模块,那么使用根模块有很大的局限性。这就是为什么我们需要使用 logger.getLogger(name) 方法创建一个新的记录器。

有使用 __name__ 变量作为记录器名称的约定。一旦我们创建了一个新的记录器,我们应该记住使用新的 logger.info() 而不是根的 logging.info() 方法来记录我们的所有消息。FileHandler() 用于使我们的自定义记录器登录到不同的文件。在这里,我们将我们的信息记录到 logfile.log。同样,Formatter() 用于更改我们记录的消息的格式。Formatter 设置在 FileHandler 对象上,而不是直接设置在记录器上。

例如,使用 getLogger() 来创建或获取记录器。然后,使用 setLogger() 方法设置日志级别。将级别设置为 logging.WARNING。接下来,使用 FileHandler() 方法定义处理程序,使用 Formatter() 方法设置格式化程序。然后,使用 addHandler() 方法将处理程序添加到记录器。最后,写一些消息进行测试。我们可以在文件 log_file.log 中看到日志。

示例代码:

#python 3.x
import logging
logger = logging.getLogger(__name__)  
logger.setLevel(logging.WARNING)
handler = logging.FileHandler('log_file.log')
formatter = logging.Formatter('%(asctime)s : %(name)s  : %(funcName)s : %(levelname)s : %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

logger.debug('A debug message')
logger.info('An info message')
logger.warning('There is something wrong')
logger.error('An error has happened.')
logger.critical('Fatal error occured. Cannot continue')

输出:

2021-07-30 11:55:31,047 : __main__  : <module> : WARNING : There is something wrong
2021-07-30 11:55:31,047 : __main__  : <module> : ERROR : An error has happened.
2021-07-30 11:55:31,047 : __main__  : <module> : CRITICAL : Fatal error occured. Cannot continue

相关文章 - Python Logging