Python:如何像专业人士一样通过 3 个简单的步骤进行日志记录

如果您曾经编写过任何 Python 代码,那么您很可能还必须添加一些print语句来弄清楚您的代码实际发生了什么。

但print独自一人只会让你走这么远。我在这里向您展示如何以最少的设置像专业人士一样开始记录。

在本文中,我们将了解如何将日志同时定向到控制台和文本文件,以便稍后检查日志。我还将向您展示如何通过在日志中包含一些额外数据来充分利用日志。

事不宜迟,让我们开始编码吧!

第 1 步:设置

我将使用 Python 3.7,但任何更高版本也可以使用。Python 3 版本之间的日志记录并没有真正改变。

我们还将使用该logging软件包,默认情况下它应该随您的 python 安装一起提供。

我将使用 Pycharm 作为我选择的 IDE,但您可以自由选择您最喜欢的。我在大多数宠物项目中都使用了几个模块。它们是如此常见,以至于我最终将它们全部制作了一个单独的包 - utils。

我假设您创建了一个名为的新 python 项目utils(并已将其放入__init__.py其中以使其成为适当的模块)。

第 2 步:实现日志记录逻辑

在我们的utils文件夹中,创建一个名为common_logging.py. 这是我们将编写所有日志记录逻辑的脚本。

我们的目标是创建一个通用函数,该函数将创建一个我们可以在任何其他项目中使用的记录器实例。

记录器实例基本上允许我们将所有print语句替换为 , 等logger.info,logger.error并附加一些在我们的日志行打印之前应用的自定义逻辑。

虽然print只是简单地输出它在控制台上获得的任何输入,但我们希望我们的高级记录器具有以下功能:

  • 每个日志行都应以生成该行的时间作为前缀。出于显而易见的原因,这很有用,它使事件序列如何发生变得非常清晰,以至于在您的日志中没有它是犯罪的!

  • 日志级别。日志行是否指示错误、警告或一般信息?每个日志行都应该以某种方式指定这一点。

  • 我们想要包含一些关于正在做日志记录的信息。这将为我们提供一些关于在哪里查找日志源并为日志行提供更多上下文的线索。

只需几行日志,我们就可以实现所有这些以及更多。

首先,我们需要logging在脚本中导入模块。我们还将定义一个通用函数,该函数将创建并返回我们的记录器实例。

import logging


def setup_logger(name=__name__):
    # Create a custom logger
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    return logger

这现在允许我们使用我们的记录器实例来记录。

对于那些对此不熟悉的人,而不是仅仅print记录您的所有数据,我们的自定义记录器允许我们使用不同的级别进行记录。

在python中,您可以使用以下方法进行日志记录:

  • 批判的

  • 错误

  • 警告

  • 信息

  • 调试

这将影响您的日志的显示方式(以及它们的去向,但现在这并不重要)。

让我们快速测试一下我们的记录器:

>>> logger = setup_logger() 
>>> logger.info("测试")

您可能已经注意到,没有任何反应。那是因为我们的日志目前无处可去。

为了告诉我们的记录器日志应该去哪里,我们需要添加一些日志处理程序。

让我们首先添加一个将日志输出到控制台的处理程序:


import logging
import sys


def setup_logger(name=__name__):
    # Create a custom logger
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    
    # Create handlers
    c_handler = logging.StreamHandler(sys.stdout)
    logger.addHandler(c_handler)
    return logger

在这里,我们将一个添加StreamingHandler到我们的记录器并告诉它通过管道将日志传输到stdout(标准输出)。

让我们再次做同样的测试:

>>> logger = setup_logger() 
>>> logger.info("Test")
测试

啊! 好多了。

第 3 步:更多处理程序和格式

我们成功地得到了一个记录到控制台的记录器。但是,如果最终我们得到的东西是花哨的,那么进行所有这些编码有什么意义print呢?

不同的是,我们可以向我们的记录器添加更多的处理程序,甚至让它以我们想要的格式输出日志。

让我们首先允许我们的记录器将内容记录到控制台和文本文件中。

import logging
import sys


def setup_logger(name=__name__):
  # Create a custom logger
  logger = logging.getLogger(__name__)
  logger.setLevel(logging.DEBUG)

  # Create handlers
  c_handler = logging.StreamHandler(sys.stdout)
  f_handler = logging.FileHandler("./logs.log")

  # Add handlers to the logger
  logger.addHandler(c_handler)
  logger.addHandler(f_handler)

  return logger

这将使我们的记录器日志记录到logs.log我们当前目录中的文件。当然,您可以自定义它以记录到不同的日志文件或目录。这完全取决于你。

现在,如果我们重新运行上面的测试,我们仍然会得到我们的输出到控制台:

>>> logger = setup_logger() 
>>> logger.info("Test")
测试

但是现在我们logs.log的目录中也有一个具有相同文本的文件。

这在调试您的应用程序时很有帮助,因为当您查看某些问题时,您不想依赖日志仍然在控制台中。将日志分成不同的文件也有助于整理日志。

不过,我们的日志看起来仍然有些平淡。我们想知道日志行是什么时候发生的以及它所处的日志级别(是错误吗?还是只是一些调试信息?)。

我们可以通过添加格式化程序来做到这一点。我们可以为控制台设置与文件不同的日志格式,但现在,我们将在两者中使用相同的格式。

import logging
import sys


def setup_logger(name=__name__):
    # Create a custom logger
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)

    # Create handlers
    c_handler = logging.StreamHandler(sys.stdout)
    f_handler = logging.FileHandler("./logs.log")
    
    # Add formatters
    c_format = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    f_format = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    c_handler.setFormatter(c_format)
    f_handler.setFormatter(f_format)

    # Add handlers to the logger
    logger.addHandler(c_handler)
    logger.addHandler(f_handler)

    return logger

让我们试一试:

>>> logg = logger_base() 
>>> logg.info("Test") 
2022-09-09 11:48:56,027 - logger.main - INFO - 测试

好的!这好多了。

我们从使用print语句将普通日志输出到控制台转变为拥有具有多个处理程序的适当记录器实例。

我们的自定义记录器能够将日志打印到控制台,并将它们保存在我们选择的日志文件中。

我们还添加了一些格式化程序,其中包括有用的信息以及我们的日志——例如日志时间、模块名称和日志信息。

您可以根据需要轻松调整记录器设置代码,无论您想要稍微不同的格式化程序还是记录到多个日志文件,都可以做到!

猜你喜欢

转载自blog.csdn.net/mopanchun/article/details/127798606