1. 程式人生 > >Python 日誌模塊logging 百日築基之得氣(二)

Python 日誌模塊logging 百日築基之得氣(二)

有一個 新增 如果 註意 3.1 17. 不知道 所在 只需要

logging模塊:

logging是一個日誌記錄模塊,可以記錄我們日常的操作。

logging日誌文件寫入默認是gbk編碼格式的,所以在查看時需要使用gbk的解碼方式打開。

logging日誌等級:CRITICAL(50) > ERROR(40) > WARNING(30) > INFO(20) > DEBUG(10)

logging有函數式的和面相對象的兩種方式。由於函數式的功能相對比較單一,不適合復雜的環境所以目前主要使用的是面向對象的logging下的方法。

logging默認顯示WARNING級別以上的日誌信息如下:

import logging
logging.debug(
"debug級別") logging.info("info級別") logging.warning("warning級別") logging.error("error級別") logging.critical("critical級別") # 打印內容如下,默認只打印WARNING級別以上。 WARNING:root:warning級別 ERROR:root:error級別 CRITICAL:root:critical級別

可以手動設置日誌級別如下:

import logging
logging.basicConfig(level=logging.DEBUG) # 設置日誌報警等級
logging.debug("
我是DEBUG") logging.info("我是info") logging.warning("我是warning") logging.error("我是error") logging.critical("我是critical") # 打印內容如下 DEBUG:root:我是DEBUG INFO:root:我是info WARNING:root:我是warning ERROR:root:我是error CRITICAL:root:我是critical

basicConfig()裏面有很多參數,參考如下:

參數名稱

描述

filename

將日誌信息寫入文件中,指定該設置項後日誌信息就不會被輸出到控制臺了

filemode

指定日誌文件的打開模式,默認為‘a‘。需要註意的是,該選項要在filename指定時才有效

format

指定日誌格式字符串,即指定日誌輸出時所包含的字段信息以及它們的順序。logging模塊定義的格式字段下面會列出。

datefmt

指定日期/時間格式。需要註意的是,該選項要在format中包含時間字段%(asctime)s時才有效。

level

指定日誌級別

stream

指定日誌輸出目標stream,如sys.stdout、sys.stderr以及網絡stream。需要說明的是,stream和filename不能同時提供,否則會引發 ValueError異常

style

Python 3.2中新添加的配置項。指定format格式字符串的風格,可取值為‘%‘、‘{‘和‘$‘,默認為‘%‘

handlers

Python 3.3中新添加的配置項。該選項如果被指定,它應該是一個創建了多個Handler的可叠代對象,這些handler將會被添加到root logger。需要說明的是:filename、stream和handlers這三個配置項只能有一個存在,不能同時出現2個或3個,否則會引發ValueError異常。

上面的時間需要使用format中包含時間段,過於format還有如下參數:

字段/屬性名稱

使用格式

描述

asctime

%(asctime)s

日誌事件發生的時間--人類可讀時間,如:2003-07-08 16:49:45,896

created

%(created)f

日誌事件發生的時間--時間戳,就是當時調用time.time()函數返回的值

relativeCreated

%(relativeCreated)d

日誌事件發生的時間相對於logging模塊加載時間的相對毫秒數(目前還不知道幹嘛用的)

msecs

%(msecs)d

日誌事件發生事件的毫秒部分

levelname

%(levelname)s

該日誌記錄的文字形式的日誌級別(‘DEBUG‘, ‘INFO‘, ‘WARNING‘, ‘ERROR‘, ‘CRITICAL‘)

levelno

%(levelno)s

該日誌記錄的數字形式的日誌級別(10, 20, 30, 40, 50)

name

%(name)s

所使用的日誌器名稱,默認是‘root‘,因為默認使用的是 rootLogger

message

%(message)s

日誌記錄的文本內容,通過 msg % args計算得到的

pathname

%(pathname)s

調用日誌記錄函數的源碼文件的全路徑

filename

%(filename)s

pathname的文件名部分,包含文件後綴

module

%(module)s

filename的名稱部分,不包含後綴

lineno

%(lineno)d

調用日誌記錄函數的源代碼所在的行號

funcName

%(funcName)s

調用日誌記錄函數的函數名

process

%(process)d

進程ID

processName

%(processName)s

進程名稱,Python 3.1新增

thread

%(thread)d

線程ID

threadName

%(thread)s

線程名稱

下面是一些基本的配置事例:

import logging
FORMAT_DATA = format="%(asctime)s - %(name)s -[%(lineno)d] - %(message)s"
logging.basicConfig(level=logging.DEBUG,
format=FORMAT_DATA,
filename="test.log",
filemode="a+")

logging.debug("我是DEBUG")
logging.info("我是info")
logging.warning("我是warning")
logging.error("我是error")
logging.critical("我是critical")

內容如下:

技術分享圖片

如果對format中asctime格式化的時間格式不滿意,可以使用basicConfig函數中的datefmt參數做調整,如下:

import logging
FORMAT_DATA = format="%(asctime)s - %(name)s -[%(lineno)d] - %(message)s"
DEFINE_TIME = "%Y/%m/%d %H:%M:%S" # 自定義時間格式
logging.basicConfig(level=logging.DEBUG,
datefmt=DEFINE_TIME,
format=FORMAT_DATA,
filename="test.log",
filemode="a+")

logging.debug("我是DEBUG")
logging.info("我是info")
logging.warning("我是warning")
logging.error("我是error")
logging.critical("我是critical")

日誌文件內容如下:

技術分享圖片

發現日期改成了我們想要的格式。

下面使用封裝後的logging寫日誌

使用logging類的步驟如下:

1、先創建一個日誌的對象

2、創建一個模板

3、創建輸出流(文件流,屏幕流兩種)

4、將流和模板綁定

5、將日誌和流進行綁定

6、使用日誌對象設置日誌等級

代碼如下:

import logging
# 創建一個日誌對象
logg = logging.getLogger("測試日誌")
# 定義一個模板
FORMATTER = logging.Formatter("%(asctime)s - %(name)s - [%(lineno)d] - %(message)s")

# 創建一個屏幕流
p_stream = logging.StreamHandler()
# 創建一個文件流
f_stream = logging.FileHandler("log.log",mode="a",encoding="utf-8")
# 將流綁定到模板 p_stream.setFormatter(FORMATTER) f_stream.setFormatter(FORMATTER)
# 將日誌和流進行綁定 logg.addHandler(p_stream) logg.addHandler(f_stream)
# 設置日誌記錄等級 logg.setLevel(logging.DEBUG) # 打印日誌信息 logg.debug("this is Debug") logg.info("this is info") logg.warning("this is warning") logg.error("this is error") logg.critical("this is critical")
# 打印內容如下 2019-02-18 19:32:54,393 - 測試日誌 - [23] - this is Debug 2019-02-18 19:32:54,393 - 測試日誌 - [24] - this is info 2019-02-18 19:32:54,393 - 測試日誌 - [25] - this is warning 2019-02-18 19:32:54,393 - 測試日誌 - [26] - this is error 2019-02-18 19:32:54,393 - 測試日誌 - [27] - this is critical

文件信息如下:

技術分享圖片

如果想為多個用戶創建不同的日誌,只需要創建流時創建不同的流即可,而不需要創建多個日誌對象,如果情況特殊考慮單獨在創建一個對象。其實我們可以在創建流的時候直接指定日誌等級。流的等級是優先於日誌對象的。如下我們創建兩個流:

import logging
# 創建一個日誌對象
logg = logging.getLogger("測試日誌")

# 創建一個程序員模板和老板模板
CORE_FORMATTER = logging.Formatter("%(asctime)s - %(name)s - [%(lineno)d] - %(message)s")
BOOS_FORMATTER = logging.Formatter("%(asctime)s - %(message)s")

# 創建一個程序員的流和一個老板的流
core_stream = logging.FileHandler("core.log",mode="a",encoding="utf-8")
boos_stream = logging.FileHandler("boos.log",mode="a",encoding="utf-8")

# 設置日誌等級(老板的日誌等級設置WARNING)
boos_stream.setLevel(logging.WARNING)  

# 將流綁定到模板
core_stream.setFormatter(CORE_FORMATTER)
boos_stream.setFormatter(BOOS_FORMATTER)

# 將日誌和流進行綁定
logg.addHandler(core_stream)
logg.addHandler(boos_stream)

# 設置日誌記錄等級
logg.setLevel(logging.DEBUG)

# 打印日誌信息
logg.debug("this is Debug")
logg.info("this is info")
logg.warning("this is warning")
logg.error("this is error")
logg.critical("this is critical")

內容如下:

技術分享圖片

這樣我們便創建了兩種不同的日誌。好吧只討論到這裏吧,更多功能小夥伴們自己慢慢挖掘吧!!!

Python 日誌模塊logging 百日築基之得氣(二)