当前位置: 首页 > 科技观察

学习在Python中充分利用日志来提高自己的编程水平

时间:2023-03-15 00:27:49 科技观察

为什么要使用日志而不是print()日志记录对于程序员来说是一个非常重要的特性。日志记录对于调试和显示运行时信息也很有用。在本文中,我将解释为什么以及如何在您的程序中使用python的日志记录模块。打印语句和日志输出之间有一个关键的区别。通常,打印语句写入标准输出(stdout),期望它是有用的信息或程序的输出。但是,日志会写入标准错误(stderr)。我们可以如下演示这种情况。importlogginglogging.basicConfig(level=logging.INFO)#We'lltalkaboutthissoon!logging.warning('Somethingbadcouldhappen!')logging.info('Youarerunningtheprogram')logging.error('Awsnap!Everythingfailed.')print("Thisistheprogramoutput")现在,如果我运行这个程序,我将在命令行中看到以下内容。$pythonlog_test.pyWARNING:root:Somethingbadcouldhappen!INFO:root:YouarerunningtheprogramERROR:root:Awsnap!Everythingfailed.Thisistheprogramoutput然而,这些消息对普通用户来说太多了。虽然这实际上在命令行上一起显示,但数据被写入两个单独的流。因此,典型用户应该执行以下操作。$pythonlog_test.py>program_output.txtWARNING:root:Somethingbadcouldhappen!INFO:root:YouarerunningtheprogramERROR:root:Awsnap!Everythingfailed.$catprogram_output.txtThisistheprogramoutput这里,通过重定向>,将有用的程序输出写入文件。这样我们就可以看到终端上发生了什么,并方便地在文件中获取输出。现在让我们尝试了解日志级别!LOG和日志级别的日志记录可能出于不同的原因而发生。这些原因分为以下严重程度。Debugging:给开发者的调试信息,比如计算值、预估参数、url、API调用等。Info:信息,没什么大不了的。警告:关于用户输入、参数等的警告。错误:报告由用户在程序中所做或发生的事情引起的错误。CRITICAL:最高优先级的日志输出。对于关键问题(取决于用例)。最常见的日志类型是DEBUG、INFO和ERROR。但是很容易出现python抛出版本不匹配警告的情况。配置记录器和日志处理程序记录器可以在不同的参数下进行配置。记录器可以配置为遵循特定的日志级别、文件名、文件模式和打印日志输出的格式。配置日志收集器参数日志记录器可以配置如下。importlogginglogging.basicConfig(filename='program.log',filemode='w',level=logging.DEBUG)logging.warning('Youaregivenawarning!')上面的设置要求logger输出日志到一个名为program.log的文件中.filemode='w'定义写入文件的性质。例如,'w'打开一个新文件,覆盖其中的任何内容。默认情况下,此参数为'a',它将以追加模式打开日志文件。有时拥有日志历史记录很有用。level参数定义了最低级别的日志记录。例如,如果设置为INFO,则不会打印调试日志。您可能已经看到,程序需要以inverbose=debug模式运行才能查看某些参数。默认级别是信息。创建日志处理程序虽然上述方法对于简单的应用程序来说很简单,但对于生产就绪的软件或服务,我们需要一个全面的日志记录过程。这是因为很难在数以百万计的调试日志中找到特定的错误日志。此外,我们需要一个贯穿整个程序和模块的记录器。这样我们就可以正确地将日志附加到同一个文件中。为此,我们可以为此任务使用具有不同配置的处理程序。importlogginglogger=logging.getLogger("MyLogger")logger.setLevel(logging.DEBUG)console_handler=logging.StreamHandler()file_handler=logging.FileHandler('file.log',mode='w')console_handler.setLevel(logging.INFO)file_handler.setLevel(logging.DEBUG)logger.addHandler(console_handler)logger.addHandler(file_handler)如你所见,我们首先得到一个传递名称的记录器。这使我们能够在程序的其他地方重用相同的记录器。我们将全局日志记录级别设置为DEBUG。这是最低的日志级别,因此允许我们在其他处理程序中使用任何日志级别。接下来,我们为控制台和文件写入创建两个处理程序。对于每个处理器,我们提供一个日志级别。这有助于减少控制台输出的开销并将它们通过管道传输到文件处理程序。便于后期处理调试。格式化日志输出日志记录不仅仅是打印我们自己的消息。有时我们需要打印其他信息,如时间、日志级别和进程ID。对于此任务,我们可以使用日志格式。让我们看看下面的代码。console_format=logging.Formatter('%(name)s-%(levelname)s-%(message)s')file_format=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')console_handler.setFormatter(console_format)file_handler.setFormatter(file_format)在将处理程序添加到记录器之前,我们可以像上面那样格式化日志输出。有更多的参数可以用于此。你可以在这里找到它们。重用代码下面是一个日志片段,我将在我的许多应用程序中继续使用它。我认为这可能对您作为读者有用。importlogginglogger=logging.getLogger('ProgramName-Version')logger.setLevel(logging.DEBUG)formatter=logging.Formatter('%(asctime)s-%(levelname)s-%(message)s')consoleHeader=logging。StreamHandler()consoleHeader.setFormatter(formatter)consoleHeader.setLevel(logging.INFO)fileHandler=logging.FileHandler(f"{output}/metabcc-lr.log")fileHandler.setLevel(logging.DEBUG)fileHandler.setFormatter(格式化程序)logger.addHandler(文件处理程序)logger.addHandler(consoleHeader)