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

来源:https://www.cnblogs.com/caesar-id/archive/2019/02/18/10397771.html
-Advertisement-
Play Games

logging模塊: logging是一個日誌記錄模塊,可以記錄我們日常的操作。 logging日誌文件寫入預設是gbk編碼格式的,所以在查看時需要使用gbk的解碼方式打開。 logging日誌等級:CRITICAL(50) > ERROR(40) > WARNING(30) > INFO(20) ...


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")

內容如下:

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

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 軟體目錄結構規範 為什麼要設計好目錄結構? “設計項目目錄結構”,就和“代碼編碼風格”一樣,屬於個人風格問題。對於這種風格上的規範,一直都存在兩種態度。 1.第一種態度,這種個人風格問題“無關緊要”。理由是能讓程式跑起來就好,風格問題根本不是問題。 2.第二種態度,規範化能更好的控製程序結構,讓 ...
  • 運行環境: Django版本2.0 ; Mysql 版本 8.0.11; 錯誤代碼: django.db.utils.OperationalError: (1045:Access denied for user 'root'@'localhost' (using password: NO) 這個錯誤 ...
  • javabean: mapper.xml 代碼 圖文解釋: 測試: 結果: 22:47:17.005 [main] DEBUG org.apache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.iba ...
  • 基本數據類型 JAVA中一共有八種基本數據類型,他們分別是 byte、short、int、long、float、double、char、boolean 在通常情況下,如果JAVA中出現了一個整數數字比如35,那麼這個數字就是int型的。如果我們希望它是byte型的,可以在數據後加上大寫的 B:35B ...
  • 控制併發有兩種經典的方式,一種是WaitGroup,另外一種就是Context WaitGroup的使用 WaitGroup可以用來控制多個goroutine同時完成 ~~~go func main() { var wg sync.WaitGroup wg.Add(2) go func() { ti ...
  • 給定兩個非空鏈表來表示兩個非負整數。位數按照逆序方式存儲,它們的每個節點只存儲單個數字。將兩數相加返回一個新的鏈表。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。 示例: 輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 原因:342 + 4 ...
  • 官網文檔鏈接: https://docs.python.org/3/library/os.path.html 概念: 該模塊在路徑名上實現了一些有用的功能,主要用於文件的屬性獲取 代碼實現: os.path.abspath(path) 返迴路徑名路徑的規範化絕對化版本 os.path.basenam ...
  • 1 package com.zlh; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.Iterator; 6 import java.util.Map; 7 import java.util... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...