📅  最后修改于: 2020-10-29 01:13:50             🧑  作者: Mango
在本教程中,我们将学习标准日志记录模块的基础知识。
日志记录是标准库中的Python模块,它提供了与框架一起使用以从Python程序释放日志消息的工具。日志记录用于跟踪软件运行时发生的事件。
开发人员在进行日志记录时会广泛使用此模块。它是用于软件开发,运行和调试的非常重要的工具。
日志记录有助于存储日志记录。假设没有日志记录,并且程序在执行过程中被中断,我们将无法找到问题的实际原因。
不知何故,我们检测到崩溃的原因,但是解决该问题将花费大量时间。使用日志记录,我们可以留下痕迹,以便程序中出现问题时,可以轻松找到问题的原因。
在运行应用程序时,我们可能会遇到很多问题,例如我们假设一个整数,并且已经被赋予了浮点数,服务正在维护中等等。这些问题难以确定且耗时。
日志记录是初学者和企业使用的功能强大的模块。该模块可以熟练地组织不同的控制处理程序,并向这些处理程序传输日志消息。
要发布日志消息,我们需要按以下方式导入日志记录模块。
import logging
现在,我们将调用记录器以记录我们要查看的消息。日志记录模块提供了五个级别,用于指定事件的严重性。每个事件都包含可用于记录严重性级别的事件的并行方法。让我们了解以下事件及其工作。
以上级别足以处理任何类型的问题。这些级别的相应数值在下面给出。
Level | Numeric Values |
---|---|
NOTSET | 0 |
DEBUG | 10 |
INFO | 20 |
WARNING | 30 |
ERROR | 40 |
CRITICAL | 50 |
日志记录模块提供了许多功能。它由几个常量,类和方法组成。常量由后面的所有大写字母表示;这些课程用大写字母表示。小写的项目代表方法。
让我们看一下模块本身提供的几个记录器对象。
让我们了解以下示例。
范例-
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),用于配置日志记录。
它接受以下一些常用参数。
我们可以使用要记录的级别参数来设置日志消息的级别。我们需要在类中传递一个常量,这将允许所有日志记录调用。
让我们了解以下示例。
范例-
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类的对象来定义自己的记录器。在这里,我们定义了常用的类和函数。
以下是日志记录模块中定义的类和函数。
如果我们没有要格式化的消息,则默认为使用原始消息。默认格式日期格式为。
%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。
日志记录模块灵活且易于使用。这对于跟踪日志记录并向用户显示适当的消息非常有用。它提供了创建自定义日志级别,处理程序类和许多其他有用方法的灵活性。
它还为小型项目提供基本日志记录。
在本教程中,我们讨论了日志记录模块的所有基本概念。我们介绍了不同级别的生成消息。