深入理解Python的logging模塊:從基礎到高級

在Python編程中,日志記錄是一種重要的調試和錯誤追蹤工具。Python的logging模塊提供了一種靈活的框架,用于發出日志消息,這些消息可以被發送到各種輸出源,如控制臺、文件、HTTP GET/POST位置等。本文將深入探討Python的logging模塊,包括其基本用法、高級特性以及如何將其應用到實際項目中。

首先,我們來看一下logging模塊的基本用法。logging模塊的主要功能是提供一種靈活的框架,用于發出日志消息。這些消息可以被發送到各種輸出源,如控制臺、文件、HTTP GET/POST位置等。logging模塊的核心是Logger類,它提供了應用程序可直接使用的接口。Logger實例化后,可以設置其日志級別(DEBUG, INFO, WARNING, ERROR, CRITICAL),并可以通過其方法來發出日志消息。

例如,以下是一個簡單的logging模塊的使用示例:

import logging# 創建一個logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)# 創建一個handler,用于寫入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)# 定義handler的輸出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)# 給logger添加handler
logger.addHandler(fh)# 記錄一條日志
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

在這個示例中,我們首先創建了一個名為’my_logger’的logger,并設置了其日志級別為DEBUG。然后,我們創建了一個handler,用于將日志消息寫入到’test.log’文件中。我們還定義了handler的輸出格式,包括時間戳、logger的名字、日志級別和日志消息。最后,我們將這個handler添加到logger中,并發出了幾條不同級別的日志消息。

除了基本的用法,logging模塊還提供了許多高級特性,如過濾器、格式化器、處理器等。過濾器可以根據日志消息的內容或級別來決定是否應該處理這條消息。格式化器可以定義日志消息的輸出格式。處理器則負責將日志消息發送到指定的輸出源。

例如,以下是如何使用過濾器和格式化器的示例:

import logging# 創建一個logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)# 創建一個handler,用于寫入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)# 創建一個過濾器,只處理INFO級別及以上的日志消息
class MyFilter(logging.Filter):def filter(self, record):return record.levelno >= logging.INFO
filter = MyFilter()
fh.addFilter(filter)# 定義handler的輸出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)# 給logger添加handler
logger.addHandler(fh)# 記錄一條INFO級別的日志消息和一條DEBUG級別的日志消息
logger.info('This is an info message')
logger.debug('This is a debug message')  # 這條消息不會被處理,因為它的級別低于INFO

在這個示例中,我們首先創建了一個名為’my_logger’的logger,并設置了其日志級別為DEBUG。然后,我們創建了一個handler,用于將日志消息寫入到’test.log’文件中。我們還創建了一個過濾器,只處理INFO級別及以上的日志消息。最后,我們將這個handler添加到logger中,并發出了兩條不同級別的日志消息。由于我們的過濾器只處理INFO級別及以上的日志消息,所以DEBUG級別的日志消息不會被處理。

本專欄封裝日志工具類供外部使用:

配置文件

BASE:log_level: "debug"fh_file_log_level: "debug"  #生產環境換成warninglog_extension: ".log"test:url: "http://119.3.246.198:64644"

配置文件調用代碼更新

import os
from utils.YamlUtil import YamlReadercurrent = os.path.abspath(__file__)BASE_DIR = os.path.dirname(os.path.dirname(current))_config_path = BASE_DIR + os.sep + "config"
_config_file = _config_path + os.sep + 'conf.yml'_log_path = BASE_DIR + os.sep + "logs"
def get_config_path():return _config_pathdef get_config_file():return _config_filedef get_log_path():return _log_path
class ConfigYaml:def __init__(self):self.config = YamlReader(get_config_file()).data()def get_conf_url(self):return self.config['BASE']['test']['url']def get_conf_log_level(self):#獲取日志級別return self.config['BASE']['log_level']def get_conf_fh_file_log_level(self):#獲取日志文件級別return self.config['BASE']['fh_file_log_level']def get_conf_log_extension(self):#獲取日志文件擴展名return self.config['BASE']['log_extension']

日志工具類封裝

import logging
import datetime,os
from config import Conf
from config.Conf import ConfigYamllog_levels = {"info": logging.INFO,"debug": logging.DEBUG,"warning": logging.WARNING,"error": logging.ERROR,
}class Logger:def __init__(self, log_file, log_name, log_level, fh_file_log_level):self.log_file = log_fileself.log_name = log_nameself.log_level = log_levelself.fh_file_log_level = fh_file_log_levelself.logger = logging.getLogger(self.log_name)self.logger.setLevel(log_levels[self.log_level])if not self.logger.handlers:fh_stream = logging.StreamHandler()fh_stream.setLevel(log_levels[self.log_level])formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')fh_stream.setFormatter(formatter)fh_file = logging.FileHandler(self.log_file,encoding='utf-8')  #注意,此處不寫encoding='utf-8',會出現導出日志中的中文亂碼。fh_file.setLevel(log_levels[self.fh_file_log_level])fh_file.setFormatter(formatter)self.logger.addHandler(fh_stream)self.logger.addHandler(fh_file)log_path = Conf.get_log_path()
current_time = datetime.datetime.now().strftime("%Y-%m-%d")
conf_read = ConfigYaml()
log_extention = conf_read.get_conf_log_extension()
log_file =os.path.join(log_path,current_time+log_extention)
log_level = conf_read.get_conf_log_level()
fh_file_log_level = conf_read.get_conf_fh_file_log_level()def tester_log(log_name = __file__):return Logger(log_file=log_file, log_name=log_name, log_level=log_level, fh_file_log_level=fh_file_log_level).logger

這段代碼是一個Python日志記錄模塊的實現。它使用了logging庫來創建和管理日志記錄器,并提供了自定義的日志級別和格式。

首先,導入了必要的模塊:

  • logging:用于創建和管理日志記錄器。
  • datetimeos:用于獲取當前時間和構建文件路徑。
  • ConfConfigYaml:從配置文件中讀取配置信息。

然后,定義了一個名為Logger的類,用于創建和管理日志記錄器。該類接受以下參數:

  • log_file:日志文件的路徑。
  • log_name:日志記錄器的名稱。
  • log_level:日志記錄器的級別。
  • fh_file_log_level:文件處理器的日志級別。

在類的構造函數中,首先根據傳入的參數創建一個日志記錄器對象,并設置其級別。然后,如果日志記錄器沒有處理程序(handler),則創建一個流處理器(StreamHandler)和一個文件處理器(FileHandler)。流處理器將日志輸出到控制臺,而文件處理器將日志寫入指定的文件中。

接下來,定義了一些變量和常量:

  • log_path:日志文件所在的目錄路徑。
  • current_time:當前時間的字符串表示形式,格式為"YYYY-MM-DD"。
  • conf_read:一個ConfigYaml對象,用于讀取配置文件中的配置信息。
  • log_extention:日志文件的擴展名。
  • log_file:完整的日志文件路徑。
  • log_level:日志記錄器的級別。
  • fh_file_log_level:文件處理器的日志級別。

最后,定義了一個名為tester_log的函數,用于創建并返回一個日志記錄器對象。該函數接受一個可選參數log_name,默認值為當前文件的名稱。

使用這個模塊,你可以創建一個日志記錄器對象,并通過調用其方法來記錄不同級別的日志消息。例如,可以使用logger.info()logger.debug()logger.warning()logger.error()來記錄不同級別的日志消息。

工具類應用

在requests封裝類中對requests添加日志

import requests
from utils.LogUtil import tester_log
class Request:def __init__(self):self.log = tester_log()def requests_api(self, url, data=None, json=None, headers=None, cookies=None, method="get"):if method == "get":self.log.debug("發送get請求")r = requests.get(url, data=data, json=json, headers=headers, cookies=cookies)elif method == "post":self.log.debug("發送post請求")r = requests.post(url, data=data, json=json, headers=headers, cookies=cookies)code = r.status_codetry:body = r.json()except Exception as e:body = r.textres = dict()res["code"] = coderes["body"] = bodyreturn resdef get(self, url, **kwargs):return self.requests_api(url, method="get", **kwargs)def post(self, url, **kwargs):return self.requests_api(url, method="post", **kwargs)

調用效果

def login():conf_y = ConfigYaml()r = Request()url_path = conf_y.get_conf_url()url = url_path+'/prod-api/login'data = {"username":"test","password":"49e881218a48a363c35c5215fdc80d3f48d6a17ba0a1f9242c66aebc7ea29c626b26d7ef3bdae00ee9fde85bbf837dcce9f9e4e8f4371d74ff6eaf98ab53d7715996761ef56bff06461e74eb4b3f582949fb3b5281a89fc997a1de35f86a9aad35b87980dcf94e43191293"}res=r.requests_api(url,json=data,method="post")# r = requests.post(url,json=data)print(res)if __name__ == '__main__':login()

在這里插入圖片描述在這里插入圖片描述

總的來說,Python的logging模塊提供了一種靈活的框架,用于發出日志消息。通過使用logging模塊,我們可以方便地記錄和管理程序的運行情況,從而更好地進行調試和錯誤追蹤。雖然logging模塊的基本用法相對簡單,但其高級特性卻非常強大,可以幫助我們更有效地使用日志記錄。因此,對于任何使用Python進行開發的程序員來說,理解和掌握logging模塊都是非常必要的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457206.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457206.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457206.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

http請求連接

1、在Info.plist中添加NSAppTransportSecurity類型Dictionary。2、在NSAppTransportSecurity下添加NSAllowsArbitraryLoads類型Boolean,值設為YES轉載于:https://www.cnblogs.com/liuting-1204/p/5919233.html

數據庫不完全恢復 以及恢復到測試環境:

sample 1: 1.清空歸檔日志 RMAN> crosscheck archivelog all; RMAN> delete achivelog all; 2.清空數據文件。 select name from v$datafile; rm v$datafile 3.恢復數據 ##check file date: ##把db數據恢復到:2017-02-05 00:00:00 ls -lt /ngenprdblog/ ls…

centos7安裝java6_CentOS7.6安裝jdk1.8

2、登錄Linux服務器,通過rz命令將jdk導入服務器如果沒有rz命令 需要先安裝lrzszyum install lrzsz -y3、將jdk壓縮包解壓到指定路徑 -C 指定路徑4、配置環境變量編輯/etc/profile文件 在末尾加上以下內容 wq保存退出source /etc/profile文件 使配置文件生效export J…

ubuntu安裝wkhtmltopdf

下載安裝wkhtmltox系統環境 http://wkhtmltopdf.org/downloads.html wget https://bitbucket.org/wkhtmltopdf/wkhtmltopdf/downloads/wkhtmltox-0.13.0-alpha-7b36694_linux-precise-amd64.deb dpkg -i 安裝包名字 當我把它生成pdf的時候我想讓每個塊都是一頁,經過…

人生苦短,我用python——當我在玩python的時候我玩些什么 -

程序的基本思路 用一個txt文件記錄電腦的一天內累計使用時間累計使用時間超過若干小時就會自動關機程序開機自動運行 為什么我最后選擇了python 想著怎么寫、搜資料的時候就發現Java并不適合,雖然不是不能實現,但有好幾個問題解決起來都有點麻煩。對我這…

IO流的練習5 —— 讀取文件中的字符串,排序后寫入另一文件中

需求:已知s.txt文件中有這樣的一個字符串:“hcexfgijkamdnoqrzstuvwybpl”     請編寫程序讀取數據內容,把數據排序后寫入ss.txt中。分析:   A:讀取文件中的數據   B:把數據存在一個字符串中   C…

java解析未知key json_Gson解析JSON中動態未知字段key的方法

前面一篇文章我介紹了Gson的解析的基本方法。但我們在享受Gson解析的高度封裝帶來的便利時,有時可能會遇到一些特殊情況,比如json數據中的字段key是動態可變的時候,由于Gson是使用靜態注解的方式來設置實體對象的,因此我們很難直接…

Twisted入門教程(5)

2019獨角獸企業重金招聘Python工程師標準>>> 第五部分:由Twited支持的詩歌下載服務客戶端 你可以從這里從頭開始閱讀這個系列 抽象地構建客戶端 在第四部分中,我們構建了第一個使用Twisted的客戶端。它確實能很好地工作,但仍有提高…

Jquery 學習之基礎一

1.添加一個CSS類 $("button").click(function(){ $("#div1").addClass("important blue");}); 2.移除一個類 $("button").click(function(){ $("h1,h2,p").removeClass("blue");}); 3.切換類 $("button&…

**print('人生苦短 我愛Python')**

print(‘人生苦短 我愛Python’) 一、變量 **""" 1.代碼自上而下執行 2_運算符和表達式.一行一句,不要把多個語句寫到一行上,可讀性不好 3中文只能出現在引號里,其他地方不能出現中文 4不能隨意縮進 """**pr…

java線程提高速度_如何在JAVA中減慢線程速度

我有這個類,我在其中運行10次for循環.該類實現了Runnable接口.現在在main()中我創建了2個線程.現在兩個都將循環運行到10.但我想檢查每個線程的循環計數.如果t1超過7,則讓它休眠1秒,以便讓t2完成.但是如何實現這一目標呢?請參閱代碼.我嘗試但看起來完全愚蠢.只是如何…

(轉ORCLE導入導出命令)

oracle數據庫導入導出命令!Oracle數據導入導出imp/exp 功能:Oracle數據導入導出imp/exp就相當與oracle數據還原與備份。 大多情況都可以用Oracle數據導入導出完成數據的備份和還原(不會造成數據的丟失)。 Oracle有個好處&…

筆記本(華碩UL80VT)軟件超頻setFSB

Warning !!!If you are a beginner, do not use this software. This software is for power users only. Use "SetFSB.exe" at your own risk.試了setfsb各種版本,基本不能打開。還有官網的免費版,居然不能用,真是很奇怪。 官網&a…

Day01-python編程基礎

1. 程序 為了完成某種特定功能,以某種程序設計語言編寫的有序指令的集合。程序是指揮cpu工作的“工作手冊”。計算機只能執行二進制代碼,程序設計語言一般類似英文,想要讓計算機理解你寫的程序,必須把程序代碼“翻譯”成計算機能…

pro c 訪問 MySQL_Pro*C??OCI??OCCI??及OCI介紹

Pro*C OCIOCCI 這三種都是C/C訪問數據庫的手段。Pro*C:內嵌SQL,預編譯后把內嵌SQL處理為ORACLE標準運行庫的調用,然后再象編譯一般的C程序一樣進行編譯、連接、運行。1.proc XXX.pc2.gcc/g XXX.c –lclntsh(PRO*C的預編譯,也可直接MAKEFILE…

細說Cookie

http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html轉載于:https://www.cnblogs.com/benpaodexiaopangzi/p/5933230.html

Node.js~在linux上的部署

我們以centOS為例來說說如何部署node.js環境 一 打開centos,然后開始下載node.js包 curl --silent --location https://rpm.nodesource.com/setup_6.x | bash - yum -y install nodejs 二 安裝gcc環境 yum install gcc-c make 安裝完成! 三 安裝nodejs的npm,這是一個包程序工具…

Django中的class Meta知識點

今天來回顧一下Django中model的class Meta class Main(models.Model):img models.CharField(max_length200) # 圖片name models.CharField(max_length100) # 名稱trackid models.CharField(max_length16) # 通用idclass Meta:abstract True #抽象類class MainWheel(…

python wheel使用_Python wheel.Wheel方法代碼示例

# 需要導入模塊: from pip import wheel [as 別名]# 或者: from pip.wheel import Wheel [as 別名]def from_line(cls, name, comes_fromNone, prereleasesNone):"""Creates an InstallRequirement from a name, which might be arequirement, directory contai…

英語學習Day1

今天要開始學英語了,我這個人沒什么長性,語言這種東西對我來說又是很不擅長的一種技能,那為什么要學英語呢?我要做翻譯,也是呵呵了,主要是我想賺錢,這個力量能夠支撐我吧,我想。 網上…