📜  Python日志模块

📅  最后修改于: 2020-10-29 01:13:50             🧑  作者: Mango

登录Python

在本教程中,我们将学习标准日志记录模块的基础知识。

什么是日志记录?

日志记录是标准库中的Python模块,它提供了与框架一起使用以从Python程序释放日志消息的工具。日志记录用于跟踪软件运行时发生的事件。

开发人员在进行日志记录时会广泛使用此模块。它是用于软件开发,运行和调试的非常重要的工具。

日志记录有助于存储日志记录。假设没有日志记录,并且程序在执行过程中被中断,我们将无法找到问题的实际原因。

不知何故,我们检测到崩溃的原因,但是解决该问题将花费大量时间。使用日志记录,我们可以留下痕迹,以便程序中出现问题时,可以轻松找到问题的原因。

在运行应用程序时,我们可能会遇到很多问题,例如我们假设一个整数,并且已经被赋予了浮点数,服务正在维护中等等。这些问题难以确定且耗时。

日志如何工作

日志记录是初学者和企业使用的功能强大的模块。该模块可以熟练地组织不同的控制处理程序,并向这些处理程序传输日志消息。

要发布日志消息,我们需要按以下方式导入日志记录模块。

import logging 

现在,我们将调用记录器以记录我们要查看的消息。日志记录模块提供了五个级别,用于指定事件的严重性。每个事件都包含可用于记录严重性级别的事件的并行方法。让我们了解以下事件及其工作。

  • 调试-用于提供详细信息,仅在诊断问题时使用。
  • 信息-它提供有关我们想要的东西正在运行的信息。
  • 警告-它用于警告某些意外事件,否则我们将在接下来的时间内面临问题。
  • 错误-用于在遇到严重问题时通知您该软件尚未执行某些程序。
  • 严重-它指定了严重错误,程序本身可能无法继续执行。

以上级别足以处理任何类型的问题。这些级别的相应数值在下面给出。

Level Numeric Values
NOTSET 0
DEBUG 10
INFO 20
WARNING 30
ERROR 40
CRITICAL 50

日志记录模块提供了许多功能。它由几个常量,类和方法组成。常量由后面的所有大写字母表示;这些课程用大写字母表示。小写的项目代表方法。

让我们看一下模块本身提供的几个记录器对象。

  • Logger.info(msg):用于在此记录器上记录级别为INFO的消息。
  • Logger.warning(msg):用于在此记录器上记录警告级别为WARNING的消息。
  • Logger.error(msg):用于在此记录器上记录错误级别为ERROR的消息。
  • Logger.critical(msg):用于在此记录器上记录级别为CRITICAL的消息。
  • Logger.log(lvl,msg):用于在此记录器上记录具有整数级别lvl的消息。
  • Logger.exception(msg):用于在此记录器上记录错误级别为ERROR的消息。
  • Logger.setLevel(lvl):用于将此记录器的开头设置为lvl。它将忽略下面编写的所有消息。
  • Logger.addFilter(filt):用于将特定的过滤器过滤器添加到此记录器。
  • Logger.removeFilter(filt):用于消除对此记录器的特定过滤器过滤。
  • Logger.filter(record):将logger的过滤器放入记录中。如果记录可用并且要处理,则返回True。否则,它将返回False。
  • Logger.addHandler(hdlr):用于将特定的处理程序hdlr添加到此记录器。
  • Logger.removeHandler(hdlr):用于消除对此记录器的特定处理程序hdlr。
  • Logger.hasHandlers():用于验证记录器是否包含已配置的任何处理程序。

让我们了解以下示例。

范例-

import logging

logging.debug('The debug message is displaying')
logging.info('The info message is displaying')
logging.warning('The warning message is displaying')
logging.error('The error message is displaying')
logging.critical('The critical message is displaying')

输出:

WARNING:root:The warning message is displaying
ERROR:root:The error message is displaying
CRITICAL:root:The critical message is displaying 

说明:

从上面的输出中可以看到,每条消息都与根一起显示,根是为其默认记录器指定的记录模块名称。消息和级别名称用冒号(:)分隔,并以默认输出格式print消息。

我们可以注意到debug()和info()消息未显示消息,因为默认情况下,日志模块记录的严重性级别为WARNING,ERROR和CRITICAL。

基本配置

日志记录的主要任务是将记录事件存储在文件中。日志记录模块提供basicConfig(** kwarg),用于配置日志记录。

它接受以下一些常用参数。

  • 级别-指定的严重性级别由根级别设置。
  • filename-它指定一个文件。
  • filemode-以特定模式打开文件。打开文件的默认模式是a,这意味着我们可以附加内容。
  • 格式-格式定义日志消息的格式。

我们可以使用要记录的级别参数来设置日志消息的级别。我们需要在类中传递一个常量,这将允许所有日志记录调用。

让我们了解以下示例。

范例-

import logging

logging.basicConfig(level=logging.DEBUG)
logging.debug('The dubug message is logged')

输出:

DEBUG:root: The debug will be get logged

类似地,我们可以将消息记录到文件中,而不是在控制台上显示,可以在basicConfig()函数使用filename和filemode,并且可以使用format属性确定消息的格式。让我们了解以下示例。

范例-

import logging

logging.basicConfig(filename='msg.log', filemode='w', format='%(name)s - %(levelname)s - %(message)s')
logging.warning('This will get logged to a file')

输出:

root - WARNING - This will get logged to a file

说明:

以上输出将显示在msg.log文件中,而不是控制台中。我们在w中打开了文件,这意味着该文件以“写入模式”打开。如果basicConfig()被多次调用,则该程序的每次运行都会重写日志文件的输出。所述basicConfig()函数可以通过将额外的参数被修改(HTTPS://文档Python。组织/ 3 /库/ logging.html#logging.basicConfig)。

让我们了解以下示例。

范例-

import logging

#Create and configure logger using the basicConfig() function
logging.basicConfig(filename="newfile.log",
               format='%(asctime)s %(message)s',
               filemode='w')

#Creating an object of the logging
logger=logging.getLogger()

#Setting the threshold of logger to DEBUG
logger.setLevel(logging.DEBUG)

#Test messages
logger.debug("This is a harmless debug Message")
logger.info("This is just an information")
logger.warning("It is a Warning. Please make changes")
logger.error("You are trying to divide by zero")
logger.critical("Internet is down") 

输出:

2020-09-05 13:17:39,204 This is a harmless debug Message
2020-09-05 13:17:39,205 This is just an information
2020-09-05 13:17:39,205 It is a Warning. Please make changes
2020-09-05 13:17:39,205 You are trying to divide by zero
2020-09-05 13:17:39,205 Internet is down

说明:

上面的代码将生成一个文件,我们可以在打开文件时看到输出。

格式化输出

可以根据我们的要求修改程序中作为日志消息传递的字符串。给定的字符串和Logrecord的一部分中包含一些基本元素。让我们了解以下示例。

范例-

import logging

logging.basicConfig(format='%(process)d-%(levelname)s-%(message)s')
logging.warning('This is a Warning Message')

输出:

18472-WARNING-This is a Warning Message

format参数可以根据需要接受具有Logrecord属性的任何形式的字符串。

让我们了解以下示例-

范例-

import logging

logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO)
logging.info('Admin logged in')

输出:

2020-09-02 20:12:06,288 - Admin logged in

%(asctime)属性添加了Logrecord的时间创建。我们还可以使用datefmt属性来自定义格式,该属性提供与datetime模块相同的函数。

范例-

import logging

logging.basicConfig(format='%(asctime)s - %(message)s', datefmt='%d-%b-%y %H:%M:%S')
logging.warning('Admin logged out')

输出:

02-Sep-20 13:29:05 - Admin logged out

记录变量数据

有时,我们想在日志中包含来自应用程序的动态信息。日志记录方法接受字符串作为参数,并且优良作法是使用变量data格式化字符串并传递给log方法。

但是除此之外,我们还可以为消息使用格式字符串,并将变量数据附加为参数。

让我们了解以下示例-

import logging

name = 'Peter Decosta'

logging.error('%s raised an error', name)

输出:

ERROR:root: Peter Decosta raised an error

说明:

传递给该方法的参数将在消息中作为变量数据进行卷积。

我们可以使用f {字符串}格式化给定的字符串。它提供了一种简便的方法来处理字符串。

范例-

import logging

name = 'Antonio Mino'

logging.error(f'{name} raised an error')

输出:

ERROR:root: Antonio Mino raised an error

捕获堆栈跟踪

我们可以使用日志记录模块捕获应用程序中的全部跟踪堆栈。日志函数有一个exc_info参数;如果将其设置为True,则它可以捕获Exception信息。

让我们了解以下示例-

范例-

import logging

a = 10
b = 0

try:
  c = a / b
except Exception as e:
  logging.error("Exception occurred", exc_info=True)

输出:

ERROR:root:Exception occurred
Traceback (most recent call last):
  File "C:/Users/DEVANSH SHARMA/PycharmProjects/Hello/loggingFile.py", line 224, in 
    c = a / b
ZeroDivisionError: division by zero

说明:

如果我们未将exc_info设置为true,则输出将不会通知我们有关该异常的信息。如果仅显示以下输出,则很难调试数千行代码中的错误。

ERROR:root:Exception occurred

还有其他选项可获取有关异常的完整信息。日志记录模块提供exception()方法,该方法记录带有ERROR的消息并附加异常信息。要使用它,请与调用logging.error(exc_info = True)一样调用logging.exception()方法。

让我们了解以下示例。

范例-

import logging

a = 10
b = 0

try:
  c = a / b
except Exception as e:
  logging.exception("Exception occurred", exc_info=True)

输出:

ERROR:root:Exception occurred
Traceback (most recent call last):
  File "C:/Users/DEVANSH SHARMA/PycharmProjects/Hello/loggingFile.py", line 224, in 
    c = a / b
ZeroDivisionError: division by zero

我们可以在error(),debug()或critical()方法中使用任一选项来获取有关异常的信息。

类和功能

到目前为止,我们已经看到了名为root的默认记录器。每当调用日志记录模块的函数(例如logging.debug(),logging.error()等)时,就使用该模块。我们还可以通过创建Logger类的对象来定义自己的记录器。在这里,我们定义了常用的类和函数。

以下是日志记录模块中定义的类和函数。

  • 记录器-记录器对象用于直接调用函数。
  • LogRecord-它会自动创建日志记录文件,该文件包含与所有正在记录的事件有关的信息,例如记录器的名称,函数,行号,消息等。
  • 处理程序处理程序用于将LogRecord调度到输出端点。 FileHandler,StreamHandler,HTTPHandler,SMTTPHandlerHandler的子类。
  • 格式化程序-格式化程序用于定义输出的结构。它使用字符串格式化方法来指定日志消息的格式。

如果我们没有要格式化的消息,则默认为使用原始消息。默认格式日期格式为。

%Y-%m-%d %H:%M:%S

以下格式用于使日志消息成为人类可读的格式。

'%(asctime)s - %(levelname)s - %(message)s'

我们通常使用Logger类的对象,这些对象是使用logging.getLogger(name)函数创建的。如果使用相同的名称多次调用getLogger()方法,它将返回同一记录器对象的引用。

让我们了解以下示例:

范例-

import logging

logger = logging.getLogger('first_logger')
logger.warning('This is a warning message')

输出:

This is a warning message

说明:

我们已经创建了自己的记录器名称first_logger,但是与root记录器不同,first_logger不是输出格式的一部分。要显示它,请将其传递给配置函数。然后输出将如下所示。

WARNING:first_logger:This is a warning message

与处理程序一起工作

处理程序通常用于配置记录器,并将日志一次传输到许多地方。它通过HTTP或电子邮件将日志消息发送到标准输出流或文件。

让我们了解以下创建处理程序的示例。

例:

import logging

# Create a custom logger_obj
logger_obj = logging.getLogger(__name__)

# Create handlers
w_handler = logging.StreamHandler()
e_handler = logging.FileHandler('file.log')
w_handler.setLevel(logging.WARNING)
e_handler.setLevel(logging.ERROR)

# Create formatters and add it to handlers
c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
w_handler.setFormatter(c_format)
e_handler.setFormatter(f_format)

# Add handlers to the logger_obj
logger_obj.addHandler(w_handler)
logger_obj.addHandler(e_handler)

logger_obj.warning('This is a warning message')
logger_obj.error('This is an error message')

输出:

__main__ - WARNING - This is a warning message
__main__ - ERROR - This is an error message

说明:

在以下程序中,我们创建了一个名为logger_obj的自定义记录器,并创建了一个LogRecord来存储记录事件的所有记录,并将其传递给它具有的所有Handler:w_handlers和e_handlers。

w_handlers是级别为WARNING的流处理程序。它接受LogRecord中的日志以生成格式字符串的输出并将其print到屏幕上。

e_handler是级别为ERROR的文件处理程序。它不将LogRecord视为其级别WARNING。

结论

日志记录模块灵活且易于使用。这对于跟踪日志记录并向用户显示适当的消息非常有用。它提供了创建自定义日志级别,处理程序类和许多其他有用方法的灵活性。

它还为小型项目提供基本日志记录。

在本教程中,我们讨论了日志记录模块的所有基本概念。我们介绍了不同级别的生成消息。