帮酷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  |  如果智培  |  酷兔英语