本篇文章帶給大家的內容是關於Python中logging日誌模組的解析(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
一、日誌記錄的等級
#debug:優先權10,記錄調試的詳細信息,只在調試時開啟
info:優先權20,記錄普通的訊息,報告錯誤和警告等待。
warning:優先權30,記錄相關的警告訊息。
error:優先權40,記錄錯誤訊息、程式崩潰
critical:優先權50,記錄錯誤訊息
二、logging模組的主要結構
查看logging的源碼,可知主要有四個類別實作功能:
Loggers:提供應該程式直接使用的接口,如相關的組態設定
Handlers:將Loggers產生的日誌傳到指定位置,設定日誌儲存的位置;
Filters:對輸出日誌進行過濾操作;
Formatters:控制日誌的輸出格式
Formatters
Formatters物件定義了日誌的輸出格式,有多種可選參數。
參數 | 意義 |
---|---|
%(name)s | #Logger的名字 |
%(levellno)s | #數字形式的日誌等級 |
%(levelname)s | 文字形式的日誌等級 |
%(pathname)s | 呼叫日誌輸出函數的模組的完整路徑名,可能沒有 |
%(filename)s | 呼叫日誌輸出函數的模組的檔案名稱 |
%(module)s | 呼叫日誌輸出函數的模組名稱 |
%(funcName)s | 呼叫日誌輸出函數的函數名稱 |
%(lineno)d | 呼叫日誌輸出函數的語句所在的程式碼行 |
#%(created)f | 目前時間,以unix標表示的時間浮點表示 |
%(relativeCreated)d | #輸出日誌資訊時,自Logger建立以來的毫秒數 |
%(asctime)s | 字串形式的當前時間,預設格式是'2018-11-22 16:49:45,896',逗號後面是毫秒 |
#%(thread)d | 執行緒ID,可能沒有 |
#%(threadName)s | 執行緒名,可能沒有 |
%(process)d | 進程ID,可能沒有 |
%(message)s | 使用者輸出的訊息 |
實例:
import logging #fmt:定义输出的日志信息的格式 #datefmt:定义时间信息的格式,默认为:%Y-%m-%d %H:%M:%S #style:定义格式化输出的占位符,默认是%(name)格式,可选{}或$格式 formatter=logging.Formatter(fmt='%(asctime)s %(levelname)s: %(message)s' ,datefmt='%Y-%m-%d %H:%M:%S',style='%')
Handlers日誌處理器
日誌處理器用來處理日誌的具體流向,是輸出到檔案還是標準輸出等,它通過設定Formatter控制輸出格式,新增filters過濾日誌。
常用的處理器有兩種
StreamHandler:用來列印日誌
其它的處理器 | ||
---|---|---|
名稱 | 詳細位置 | 說明 |
#RotatingHandler | logging.handlers.RotatingHandler | |
TimeRotatingHandler | logging.handlers.TimeRotatingHandler | |
SocketHandler | logging.handlers.SocketHandler | |
#DatagramHandler | logging.handlers.DatagramHandler | |
SMTPHandler | #logging.handlers.SMTPHandler | |
SysLogHandler | logging.handlers.SysLogHandler | |
NTEventLogHandler | logging.handlers.NTEventLogHandler | |
MemoryHandler | logging.handlers.MemoryHandler |
HTTPHandler
#logging.handlers.HTTPHandler透過「GET」或「POST」遠端輸出到HTTP伺服器
from logging import Handler #所有日志处理器的父类 handler=Handler() print('处理日志的等级:',handler.level) print('处理日志的名字:',handler.name) print('处理器的日志过滤器::',handler.filters) print('日志的格式::',handler.filters) #一些常用方法: handler.get_name() handler.set_name('') handler.createLock()#创建线程锁 handler.acquire()#获取线程锁 handler.release()#释放线程锁 handler.setLevel('info') #设置日志处理器的记录级别 handler.setFormatter(fmt='')#设置日志的输出格式 handler.addFilter('')#往处理器中添加过滤器 handler.removeFilter('')#往处理器中移除过滤器 handler.emit('')#日志记录的处理逻辑,由子类实现#Logger日誌物件
Logger管理所有記錄日誌的方法。 from logging import error, debug, warning, info, fatal, critical, getLogger
#返回一个Logger实例
#以'root'为名字的日志对象在Logger对象中只有一个实例
logger=getLogger('root')
print('获取根日志对象',logger.root)
print('获取manager',logger.manager)
print('获取根日志对象的名字',logger.name)
print('获取根日志对象记录水平',logger.level)
print('获取根日志对象过滤器列表',logger.filters)
print('获取根日志对象处理器列表',logger.handlers)
print('获取根日志对象',logger.disabled)
#设置日志记录水平
logger.setLevel('info')
#输出日志信息,格式化输出
logger.info('this is %s','info',exc_info=1)
#记录warning信息
logger.warning('')
#记录error信息
logger.error('')
#等价于logger.error('',exc_info=1)
logger.exception('')
#记录debug信息
logger.debug('')
#记录critical信息
logger.critical('')
#直接指定级别
logger.log('info','')
#添加处理器
logger.addHandler()
#移除处理器
logger.removeHandler()
#判是否有处理器
logger.hasHandlers()
-
實例:
import logging import sys def my_get_logger(appname): #获取logger实例,如果参数为空则返回root logger logger=logging.getLogger(appname) #创建日志输出格式 formatter=logging.Formatter('%(asctime)s %(levelname)s: %(message)s') #指定输出的文件路径 file_handler=logging.FileHandler('test.log') # 设置文件处理器,加载处理器格式 file_handler.setFormatter(formatter) #控制台日志 console_handler=logging.StreamHandler(sys.stdout) console_handler.formatter=formatter #为logger添加的日志处理器 logger.addHandler(file_handler) logger.addHandler(console_handler) #指定日志的最低输出级别,默认为warn级别 logger.setLevel(logging.INFO) return logger if __name__ == '__main__': logger=my_get_logger('test') logger.debug('this is debug info') logger.info('this is information') logger.warning('this is warning message') logger.error('this is error message') logger.fatal('this is fatal message,it is same ad logger.critical') logger.critical('this is critical message')
結果: -
2018-11-22 16:31:34,023 INFO: this is information 2018-11-22 16:31:34,023 WARNING: this is warning message 2018-11-22 16:31:34,023 ERROR: this is error message 2018-11-22 16:31:34,024 CRITICAL: this is fatal message,it is same ad logger.critical 2018-11-22 16:31:34,024 CRITICAL: this is critical message
四、logger日誌記錄的邏輯呼叫過程 - 記錄日誌透過呼叫logger.debug等方法;
- 首先判斷本筆記錄的日誌等級是否大於設定的級別,如果不是,直接pass,不再執行;
- 將日誌資訊當做參數建立一個LogRecord日誌記錄物件
- 將LogRecord物件經過logger過濾器過濾,如果被過濾則pass
- 日誌記錄物件被Handler處理器的過濾器過濾
判斷本筆記錄的日誌等級是否大於Handler處理器設定的級別,如果不是,直接pass,不再執行;
-
最後呼叫處理器的emit方法處理日誌記錄;
- 五、配置logger
- #透過程式碼進行完整配置,主要是透過getLogger方法實現,但不好修改
- 透過basicConfig方法實現,這種方式快速但不夠層次分明
透過logging.config.fileConfig(filepath),檔案配置
透過dictConfig的字典方式配置,這是py3.2版本引入的新的配置方法
使用檔案方式配置 #logging.cong
[loggers]
#定义日志的对象名称是什么,注意必须定义root,否则报错
keys=root,main
[handlers]
#定义处理器的名字是什么,可以有多个,用逗号隔开
keys=consoleHandler
[formatters]
#定义输出格式对象的名字,可以有多个,用逗号隔开
keys=simpleFormatter
[logger_root]
#配置root对象的日志记录级别和使用的处理器
level=INFO
handlers=consoleHandler
[logger_main]
#配置main对象的日志记录级别和使用的处理器,qualname值得就是日志对象的名字
level=INFO
handlers=consoleHandler
qualname=main
#logger对象把日志传递给所有相关的handler的时候,会逐级向上寻找这个logger和它所有的父logger的全部handler,
#propagate=1表示会继续向上搜寻;
#propagate=0表示停止搜寻,这个参数涉及重复打印的坑。
propagate=0
[handler_consoleHandler]
#配置处理器consoleHandler
class=StreamHandler
level=WARNING
formatter=simpleFormatter
args=(sys,)
[formatter_simpleFormatter]
#配置输出格式过滤器simpleFormatter
format=%(asctime)-%(name)s-%(levelname)s-%(message)s
注意:可以看到logger和Handler都可以設定日誌級別,日誌輸出是取最高級別。
import yaml from logging.config import dictConfig import os filename=os.path.dirname(os.path.abspath(__file__)) with open(filename+'/logging.yaml','r') as f: log=yaml.load(f.read()) dictConfig(log)
#logging.yaml #注意:yaml格式严格,:后面一定要带空格 version: 1 formatters: simple: format: '%(asctime)s-%(name)s-%(levelname)s-%(message)s' handlers: console: class: logging.StreamHandler level: DEBUG formatter: simple stream: ext://sys.stdout console_err: class: logging.StreamHandler level: DEBUG formatter: simple stream: ext://sys.stderr loggers: simpleExample: level: DEBUG handlers: [console] propagate: no root: level: DEBUG handlers: [console_err]]######六、監聽logger設定更改######logging.config.listen(port)函數可以讓英文程式在一個socket上監聽新的配置訊息,達到在運行時改變配置,而不用重啟應用程式的目的。
import logging.config import logging logging.config.fileConfig("logging.conf") logger=logging.getLogger('test.listen') #监听端口号9999 t=logging.config.listen(9999) t.setDaemon(True) t.start()######
以上是Python中logging日誌模組的解析(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python的靈活性體現在多範式支持和動態類型系統,易用性則源於語法簡潔和豐富的標準庫。 1.靈活性:支持面向對象、函數式和過程式編程,動態類型系統提高開發效率。 2.易用性:語法接近自然語言,標準庫涵蓋廣泛功能,簡化開發過程。

Python因其簡潔與強大而備受青睞,適用於從初學者到高級開發者的各種需求。其多功能性體現在:1)易學易用,語法簡單;2)豐富的庫和框架,如NumPy、Pandas等;3)跨平台支持,可在多種操作系統上運行;4)適合腳本和自動化任務,提升工作效率。

可以,在每天花費兩個小時的時間內學會Python。 1.制定合理的學習計劃,2.選擇合適的學習資源,3.通過實踐鞏固所學知識,這些步驟能幫助你在短時間內掌握Python。

Python適合快速開發和數據處理,而C 適合高性能和底層控制。 1)Python易用,語法簡潔,適用於數據科學和Web開發。 2)C 性能高,控制精確,常用於遊戲和系統編程。

學習Python所需時間因人而異,主要受之前的編程經驗、學習動機、學習資源和方法及學習節奏的影響。設定現實的學習目標並通過實踐項目學習效果最佳。

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)