帮酷LOGO
0 0 评论
文章标签:日志  python-3  log  


介绍

logging模块是标准python库的一部分,它提供对运行软件时发生的事件的跟踪,可以向代码中添加日志记录调用,以指示发生了哪些事件。

logging 模块允许记录与应用程序操作相关的事件,以及记录用户事务事件事件的审计日志,它特别适用于将事件记录到文件中。

为什么要使用logging模块

logging模块记录一个程序中发生的事件的记录,可以看到与整个软件运行时发生的事件。

你可能更熟悉通过在代码中使用print()语句来检查事件是否发生,print()语句提供了一个基本的方法来调试代码以解决问题。 在代码中嵌入print()语句可以跟踪执行流和程序的当前状态,这种解决方案比使用logging模块少,

很难区分调试输出和正常程序输出,因为两者是混合,使用print()语句分散整个代码时,不存在禁用提供调试输出的简单方法的简单方法,在完成调试后,删除所有print()语句变得很困难,没有包含随时可用的诊断信息的日志记录

将调试消息打印到控制台

如果使用print()语句查看程序中发生的情况,看到定义类和实例化类似这样的对象:

pizza.py

class Pizza():
 def __init__(self, name, price):
 self.name = name
 self.price = price
 print("Pizza created: {} (${})".format(self.name, self.price))

 def make(self, quantity=1):
 print("Made {} {} pizza(s)".format(quantity, self.name))

 def eat(self, quantity=1):
 print("Ate {} pizza(s)".format(quantity, self.name))

pizza_01 = Pizza("artichoke", 15)
pizza_01.make()
pizza_01.eat()

pizza_02 = Pizza("margherita", 12)
pizza_02.make(2)
pizza_02.eat()


上面的代码有一个__init__方法来定义Pizza类的对象的nameprice ,它有两种方法,一种叫make(),用来做比萨饼,另一种叫eat()吃披萨 ,这两个方法接受quantity的参数,该参数在1处初始化。

现在让我们运行程序:


python pizza.py

我们将收到以下输出:


OutputPizza created: artichoke ($15)
Made 1 artichoke pizza(s)
Ate 1 pizza(s)
Pizza created: margherita ($12)
Made 2 margherita pizza(s)
Ate 1 pizza(s)

虽然print()语句允许我们看到代码正常工作,但是我们可以使用logging模块来代替这个。

在整个代码中删除或注释掉print()语句,并将import logging添加到文件的顶部:

pizza.py

import logging


class Pizza():
 def __init__(self, name, value):
 self.name = name
 self.value = value
...

logging模块有WARNING默认级别,它是DEBUG之上的一个级别,因为我们将使用logging模块进行调试,所以,需要修改配置,以便logging.DEBUG级别为我们返回信息,我们可以在下面添加下面的代码行导入语句

pizza.py

import logging

logging.basicConfig(level=logging.DEBUG)


class Pizza():
...

此级别的logging.DEBUG指的是一个整数值,我们在上面的代码中引用了一个阈值来设置阈值,DEBUG的级别为10.

现在,我们将用logging.debug()语句替换所有的print()语句,logging.DEBUG是常量不同,logging.debug()logging模块的一种方法,使用此方法时,我们可以使用传递给print()的相同字符串,如下所示。

pizza.py

import logging

logging.basicConfig(level=logging.DEBUG)


class Pizza():
 def __init__(self, name, price):
 self.name = name
 self.price = price
 logging.debug("Pizza created: {} (${})".format(self.name, self.price))

 def make(self, quantity=1):
 logging.debug("Made {} {} pizza(s)".format(quantity, self.name))

 def eat(self, quantity=1):
 logging.debug("Ate {} pizza(s)".format(quantity, self.name))

pizza_01 = Pizza("artichoke", 15)
pizza_01.make()
pizza_01.eat()

pizza_02 = Pizza("margherita", 12)
pizza_02.make(2)
pizza_02.eat()


此时,使用python pizza.py命令运行程序时,我们将收到以下输出:


OutputDEBUG:root:Pizza created: artichoke ($15)
DEBUG:root:Made 1 artichoke pizza(s)
DEBUG:root:Ate 1 pizza(s)
DEBUG:root:Pizza created: margherita ($12)
DEBUG:root:Made 2 margherita pizza(s)
DEBUG:root:Ate 1 pizza(s)

日志消息具有严重级别DEBUG以及嵌入在其中的单词root,指的是python模块的级别,for模块可以与具有不同名称的记录器层次结构一起使用,因此可以使用不同的记录器。

例如,你可以将记录器设置为有不同名称和输出的不同记录器:


logger1 = logging.getLogger("module_1")
logger2 = logging.getLogger("module_2")

logger1.debug("Module 1 debugger")
logger2.debug("Module 2 debugger")


OutputDEBUG:module_1:Module 1 debugger
DEBUG:module_2:Module 2 debugger

现在我们了解如何使用logging模块将消息打印到控制台,让我们使用logging模块打印消息。

将消息记录到文件

logging模块的主要目的是将消息记录到文件中,而不是记录到控制台,

我们可以修改logging.basicConfig()方法以包含filename参数,从而开始记录到文件,在这种情况下,让我们调用文件名test.log

pizza.py

import logging

logging.basicConfig(filename="test.log", level=logging.DEBUG)


class Pizza():
 def __init__(self, name, price):
 self.name = name
 self.price = price
 logging.debug("Pizza created: {} (${})".format(self.name, self.price))

 def make(self, quantity=1):
 logging.debug("Made {} {} pizza(s)".format(quantity, self.name))

 def eat(self, quantity=1):
 logging.debug("Ate {} pizza(s)".format(quantity, self.name))

pizza_01 = Pizza("artichoke", 15)
pizza_01.make()
pizza_01.eat()

pizza_02 = Pizza("margherita", 12)
pizza_02.make(2)
pizza_02.eat()


上面的代码与前一节中的代码相同,只是现在我们添加了日志的文件名来打印,使用python pizza.py命令运行代码后,我们的目录中应该有一个叫test.log的新文件。

让我们用nano (或你选择的文本编辑器)打开test.log文件:


nano test.log

当文件打开时,我们将看到以下内容:

test.log

DEBUG:root:Pizza created: artichoke ($15)
DEBUG:root:Made 1 artichoke pizza(s)
DEBUG:root:Ate 1 pizza(s)
DEBUG:root:Pizza created: margherita ($12)
DEBUG:root:Made 2 margherita pizza(s)
DEBUG:root:Ate 1 pizza(s)

这与我们在前一节中遇到的控制台输出类似,只是现在它位于test.log文件中。

让我们使用CTRL +x关闭文件,并且回到pizza.py文件中,以便我们可以修改代码。

我们将保持许多代码相同,但是,修改两个比萨实例中的参数,pizza_01pizza_02

pizza.py

import logging

logging.basicConfig(filename="test.log", level=logging.DEBUG)


class Pizza():
 def __init__(self, name, price):
 self.name = name
 self.price = price
 logging.debug("Pizza created: {} (${})".format(self.name, self.price))

 def make(self, quantity=1):
 logging.debug("Made {} {} pizza(s)".format(quantity, self.name))

 def eat(self, quantity=1):
 logging.debug("Ate {} pizza(s)".format(quantity, self.name))

# Modify the parameters of the pizza_01 object
pizza_01 = Pizza("Sicilian", 18)
pizza_01.make(5)
pizza_01.eat(4)

# Modify the parameters of the pizza_02 object
pizza_02 = Pizza("quattro formaggi", 16)
pizza_02.make(2)
pizza_02.eat(2)


通过这些更改,我们使用python pizza.py命令再次运行程序。

运行程序后,我们可以用nano再次打开我们的test.log文件:


nano test.log

test.log

DEBUG:root:Pizza created: artichoke ($15)
DEBUG:root:Made 1 artichoke pizza(s)
DEBUG:root:Ate 1 pizza(s)
DEBUG:root:Pizza created: margherita ($12)
DEBUG:root:Made 2 margherita pizza(s)
DEBUG:root:Ate 1 pizza(s)
DEBUG:root:Pizza created: Sicilian ($18)
DEBUG:root:Made 5 Sicilian pizza(s)
DEBUG:root:Ate 4 pizza(s)
DEBUG:root:Pizza created: quattro formaggi ($16)
DEBUG:root:Made 2 quattro formaggi pizza(s)
DEBUG:root:Ate 2 pizza(s)

首先,我们想添加一个可读的时间戳,它告诉我们什么时候创建了LogRecord 。

我们可以将该属性添加到名为format的参数中,引用它,如表中带有字符串%(asctime)s的表所示,此外,要保留DEBUG级别名称,需要包括字符串%(levelname)s,并且保留字符串消息,我们要求记录器打印,每个属性都将被colon分隔,如下面的代码所示。

pizza.py

import logging

logging.basicConfig(
 filename="test.log",
 level=logging.DEBUG,
 format="%(asctime)s:%(levelname)s:%(message)s"
 )


class Pizza():
 def __init__(self, name, price):
 self.name = name
 self.price = price
 logging.debug("Pizza created: {} (${})".format(self.name, self.price))

 def make(self, quantity=1):
 logging.debug("Made {} {} pizza(s)".format(quantity, self.name))

 def eat(self, quantity=1):
 logging.debug("Ate {} pizza(s)".format(quantity, self.name))

pizza_01 = Pizza("Sicilian", 18)
pizza_01.make(5)
pizza_01.eat(4)

pizza_02 = Pizza("quattro formaggi", 16)
pizza_02.make(2)
pizza_02.eat(2)


当我们使用python pizza.py命令运行上述代码时,我们将在test.log文件中添加新行,以及DEBUG的级别名称。


OutputDEBUG:root:Pizza created: Sicilian ($18)
DEBUG:root:Made 5 Sicilian pizza(s)
DEBUG:root:Ate 4 pizza(s)
DEBUG:root:Pizza created: quattro formaggi ($16)
DEBUG:root:Made 2 quattro formaggi pizza(s)
DEBUG:root:Ate 2 pizza(s)
2017-05-01 16:28:54,593:DEBUG:Pizza created: Sicilian ($18)
2017-05-01 16:28:54,593:DEBUG:Made 5 Sicilian pizza(s)
2017-05-01 16:28:54,593:DEBUG:Ate 4 pizza(s)
2017-05-01 16:28:54,593:DEBUG:Pizza created: quattro formaggi ($16)
2017-05-01 16:28:54,593:DEBUG:Made 2 quattro formaggi pizza(s)
2017-05-01 16:28:54,593:DEBUG:Ate 2 pizza(s)



文章标签:log  日志  python-3  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语