python logging應用及與print的區別、log監控api呼叫、format的使用
(1)最常見的應用是:
把info,warning,error同時輸出到cmd視窗(顯示)和(寫入)log檔案中;
其中info表示告訴使用者,這個是普通的資訊;
warning和error分別提醒使用者,有些警告,甚至是錯誤資訊,需要使用者注意;
把debug類資訊,只輸出(寫入)到log檔案中;
1)example_01,關於logging.debug的示例:
import logging
logging.basicConfig(filename='sample.log',level=logging.DEBUG,format = '%(asctime)s:%(name)s:%(message)s' )
def add(x,y):
return x + y
def subtract(x,y):
return x - y
def multiply(x,y):
return x * y
def devide(x, y):
return x / y
num_1 = 10
num_2 = 5
add_result = add(num_1, num_2)
logging.debug('Add:{} + {} = {}'.format(num_1,num_2,add_result))
sub_result = subtract(num_1,num_2)
logging.debug("Sub: {} -{} = {}" .format(num_1,num_2,sub_result))
mul_result = multiply(num_1,num_2)
logging.debug('Multip : {} * {} = {}'.format(num_1,num_2,mul_result))
devi_result = devide(num_1,num_2)
logging.debug('Devi : {} / {} = {}'.format(num_1 , num_2,devi_result))
Python想要輸出log到檔案中,可以有兩種方式:
logging.basicConfig加上filename引數
logging.FileHandler
此次相同目錄下,執行上述檔案後,會產生一個名稱是filename設定的sample.log檔案,中記錄的內容:
2018-07-14 09:24:20,290:root:Add:10 + 5 = 15
2018-07-14 09:24:20,330:root:Sub: 10 -5 = 5
2018-07-14 09:24:20,331:root:Multip : 10 * 5 = 50
2018-07-14 09:25:12,185:root:Add:10 + 5 = 15
2018-07-14 09:25:12,186:root:Sub: 10 -5 = 5
2018-07-14 09:25:12,186:root:Multip : 10 * 5 = 50
2018-07-14 09:25:20,519:root:Add:10 + 5 = 15
2018-07-14 09:25:20,520:root:Sub: 10 -5 = 5
2018-07-14 09:25:20,520:root:Multip : 10 * 5 = 50
2018-07-14 09:25:20,520:root:Devi : 10 / 5 = 2.0
2018-07-14 09:25:43,205:root:Add:10 + 5 = 15
2018-07-14 09:25:45,216:root:Sub: 10 -5 = 5
2018-07-14 09:25:45,892:root:Multip : 10 * 5 = 50
2018-07-14 09:25:46,551:root:Devi : 10 / 5 = 2.0
2018-07-14 09:25:53,671:root:Add:10 + 5 = 15
2018-07-14 09:25:53,672:root:Sub: 10 -5 = 5
2018-07-14 09:25:53,672:root:Multip : 10 * 5 = 50
2018-07-14 09:25:53,672:root:Devi : 10 / 5 = 2.0
2018-07-14 09:53:12,459:root:Add:10 + 5 = 15
2018-07-14 09:53:12,459:root:Sub: 10 -5 = 5
2018-07-14 09:53:12,460:root:Multip : 10 * 5 = 50
2018-07-14 09:53:12,460:root:Devi : 10 / 5 = 2.0
2018-07-14 09:54:34,299:root:Add:10 + 5 = 15
2018-07-14 09:54:34,299:root:Sub: 10 -5 = 5
2018-07-14 09:54:34,299:root:Multip : 10 * 5 = 50
2018-07-14 09:54:34,300:root:Devi : 10 / 5 = 2.0
2)關於logging.info的輸出
import logging
logging.getLogger().setLevel(logging.INFO)
logging.basicConfig(filename= 'employee.log',level = logging.INFO,
format='%(levelname)s:%(name)s:%(message)s')
class Employee:
def __init__(self,first,last):
self.first = first
self.last = last
logging.info('Created Employee: {}-{}'.format(self.fullname,self.email))
@property
def email(self):
return '{}.{}@email.com'.format(self.first,self.last)
@property
def fullname(self):
return '{}{}'.format(self.first,self.last)
a=Employee('Jack',222)
print(a.email)
print(a.fullname)
結果,employee.log檔案中內容如下:
INFO:root:Created Employee: Jack222-Jack.222@email.com
INFO:root:Created Employee: Jack222-Jack.222@email.com
INFO:root:Created Employee: Jack222-Jack.222@email.com
3)logging與print 區別,為什麼需要logging?
在寫指令碼的過程中,為了除錯程式,我們往往會寫很多print列印輸出以便用於驗證,驗證正確後往往會註釋掉,一旦驗證的地方比較多,再一一註釋比較麻煩,這樣logging就應運而生了,直接把驗證資訊存在一個檔案中(例如在logging.basicConfig(裡面設定filename= ‘employee.log’,)or直接打印出出來,不用設定finame,就會直接列印在cmd視窗中。
4)實現log使用basicConfig與真正的logging 的區別
a)使用basicConfig方法:
import logging
# 設定預設的level為DEBUG
# 設定log的格式
logging.basicConfig(
level=logging.DEBUG,
format="[%(asctime)s] %(name)s:%(levelname)s: %(message)s"
)
# 記錄log
logging.debug(...)
logging.info(...)
logging.warn(...)
logging.error(...)
logging.critical(...)
b)使用真正的logger:
import logging
# 使用一個名字為fib的logger
logger = logging.getLogger('fib')
# 設定logger的level為DEBUG
logger.setLevel(logging.DEBUG)
# 建立一個輸出日誌到控制檯的StreamHandler
hdr = logging.StreamHandler()
formatter = logging.Formatter('[%(asctime)s] %(name)s:%(levelname)s: %(message)s')
hdr.setFormatter(formatter)
# 給logger新增上handler
logger.addHandler(hdr)
對比結論:
a) 上面說的basicConfig方法可以滿足你在絕大多數場景下的使用需求,但是basicConfig有一個 很大的缺點。
b) 呼叫basicConfig其實是給root logger添加了一個handler,這樣當你的程式和別的使用了 logging的第三方模組一起工作時,會影響第三方模組的logger行為。這是由logger的繼承特性決定的。
c) 使用logger也可以進行日誌輸出,不過這樣的壞處就是程式碼量比basicConfig要大不少。 所以我建議如果是非常簡單的小指令碼的話,直接使用basicConfig就可以,如果是稍微大一些 專案,建議認真配置好logger。
d) 以上這些只是介紹了logging模組最簡單的一些功能,作為print的替代品來使用,logging 模組還有很多非常強大好用的功能,比如從檔案讀取配置、各種各樣的Handlers等等。 建議閱讀一下logging的官方文件:
(2)關於api請求的案例:
import requests
from requests import Timeout
from common.exceptions.api_exception import ApiException
from common.exceptions.data_exception import DataException
from scpy.logger import get_logger
import json
logging = get_logger(__file__)
class ApiHelper(object):
"""
api 輔助器
"""
@staticmethod
def get_url_dict(url):
"""
get 請求返回字典表
:type url str
"""
try:
logging.info('request:' + url)
response = requests.get(url, timeout=120, headers={'Connection': 'keep-alive'})
logging.info('response:' + url)
return response.json() if response.ok else {}
except Timeout as e:
logging.error('error url: %s', url)
logging.error('error message: %s', e.message)
raise ApiException(message=u"api請求超時", code=ApiException.CODE_TIMEOUT, inner_exception=e)
except Exception as e:
logging.error('error url: %s', url)
logging.error('error message: %s', e.message)
raise DataException(inner_exception=e)
@staticmethod
def post_url_dict(url, data):
"""
get 請求返回字典表
:param data:
:type url str
"""
try:
headers = {'Content-Type': 'application/json',
'Connection': 'keep-alive'}
logging.info('request:' + url)
response = requests.post(url, data=json.dumps(data), timeout=120, headers=headers)
logging.info('response:' + url)
return response.json() if response.ok else {}
except Timeout as e:
logging.error('error url: %s', url)
logging.error('error message: %s', e.message)
raise ApiException(message=u"api請求超時", code=ApiException.CODE_TIMEOUT, inner_exception=e)
except Exception as e:
logging.error('error url: %s', url)
logging.error('error message: %s', e.message)
raise ApiException(message=u"api請求未知錯誤", inner_exception=e)
if __name__ == '__main__':
from api.api_utils.api_helper import ApiHelper as apiH
from conf.config import *
import json
res = apiH.get_url_dict(GET_CMP_BASIC_INFO + "北京龍盛源小額貸款有限公司")
print (json.dumps(res, ensure_ascii=False, indent=4))
**上述利用log監控api呼叫程式碼:**
apiH.get_url_dict(GET_CMP_BASIC_INFO + "北京龍盛源小額貸款有限公司")
**format的使用是根據字串中的"{}"的一起使用的:**
url_network_company_format = GET_CMP_BASIC_INFO + u'{}'
url = url_network_company_format.format(company_name)
相關推薦
python logging應用及與print的區別、log監控api呼叫、format的使用
(1)最常見的應用是: 把info,warning,error同時輸出到cmd視窗(顯示)和(寫入)log檔案中; 其中info表示告訴使用者,這個是普通的資訊; warning和error分別提醒使用者,有些警告,甚至是錯誤資訊,需要使用者注意; 把d
Python基礎(十) __init__與__new__區別
ces weixin python2 code emp 類對象 nbsp 發現 構造 __init__與__new__區別: __init__在python,其實是,在實例化之後執行的,用來初始化一些屬性,相當於構造函數,但是又不一樣 細心一些,通過參數會有所發現,其實__
python排序函式sort()與sorted()區別
python排序函式sort()與sorted()區別 sort是容器的函式:sort(cmp=None, key=None, reverse=False) sorted是python的內建函式:sorted(iterable, cmp=None, key=None, reverse=Fal
python requests應用及流模式
import requests r=requests.get(‘http://www.baidu.com’) print(‘content–>’+r.content) //輸出位元組形式 print(‘text–>’+r.text) //輸出亂碼 print(‘encoding–
painless指令碼應用及與elasticsearch,java的結合使用
寫在前面 painless是一個較新的指令碼語言,畢竟不是一加一等於二那麼簡單,開始不懂是很正常的,如果看不懂 請看第二遍第三遍乃至N次 相信我 一定能看得懂的,書讀百遍,其
Ioctl使用及與unlocked_ioctl區別
1. Ioctl 用來做什麼? 大部分驅動除了需要具備讀寫裝置的能力外,還需要具備對硬體控制的能力。例如,要求裝置報告錯誤資訊,改變波特率,這些操作常常通過ioctl方法來實現。 1.1 使用者使用方法 在使用者空間,使用ioctl
BDD本質及與ATDD區別
bullet 易懂 一點 view 方便 then nbsp 開發 amp 說起BDD,你會想到什麽? 在剛接觸BDD(Behavior Driven Development,行為驅動開發)的時候,我以為就是用Cucumber這樣的工具來編寫場景用例,從而實現
[ubuntu]安裝並使用python 3.6及與2.7的切換
當前使用ubuntu14.04 1.新增python3.6安裝包,並安裝(也可以去官網下載安裝包) linux 報錯E: Unable To Locate Package Software-properties-common https://blog.csdn.net/q
人臉與影象識別、NLP與情感分析、語言翻譯API呼叫
API是一套用於構建應用軟體程式的規範、協議和工具。以下所有的API可歸類到人臉和影象識別;文字分析+NLP+情感分析;語言翻譯 一、人臉和影象識別 1.Animetrics Face Recogn
MongoDB自動增長id實現、自定義函式呼叫、與Spring整合
昨天同事問實現MongoDB主鍵自動增長有什麼好的辦法,雖然喜歡MongoDB客戶端驅動程式自動生成的id,不過還是來測試了一下,僅僅是測試哦 廢話少說 1、建立專案,新增依賴 <dependencies> <dependen
python基礎-程序池、submit同異步呼叫、shutdown引數、ProcessPoolExecutor程序池、程序池ftp
引入程序池 在學習執行緒池之前,我們先看一個例子 from multiprocessing import Process import time def task(name): print("name",name) time
六十四、Linux監控平臺介紹、zabbix監控介紹、安裝zabbix、忘記Admin密碼如何做
LInux監控平臺介紹 zabbix監控介紹 安裝zabbix 忘記Admin密碼如何做 六十四、Linux監控平臺介紹、zabbix監控介紹、安裝zabbix、忘記Admin密碼如何做一、Linux監控平臺介紹 cacti、nagios、zabbix、smokeping、open-falco
Vue.js——使用$.ajax和vue-resource實現OAuth的註冊、登入、登出和API呼叫【6】
概述 上一篇我們介紹瞭如何使用vue resource處理HTTP請求,結合服務端的REST API,就能夠很容易地構建一個增刪查改應用。 這個應用始終遺留了一個問題,Web App在訪問REST API時,沒有經過任何認證,這使得服務端的REST API是不安全的,只要有人知道api地址,就可以呼叫AP
Python金融應用編程(數據分析、定價與量化投資)
Python金融大數據項目實戰之Python金融應用編程(數據分析、定價與量化投資) 分享下載地址給大家——https://pan.baidu.com/s/1dFzXGUP 密碼: jbz8 本教程介紹使用Python進行數據分析和金融應用開發的基礎知識。 課程從介紹簡單的金融應用開始,帶領
大數據項目實戰之Python金融應用編程(數據分析、定價與量化投資)
python金融大數據項目實戰之Python金融應用編程(數據分析、定價與量化投資)分享網盤地址:https://pan.baidu.com/s/1bpyGttl 密碼: bt56內容簡介本教程介紹使用Python進行數據分析和金融應用開發的基礎知識。課程從介紹簡單的金融應用開始,帶領學員回顧Python的基
常見位操作及運算應用舉例:1,C語言中位運算子異或“∧”的作用2,異或運算的作用3,&(與運算)、|(或運算)、^(異或運算)
1 C語言中位運算子異或“∧”的作用: 異或運算子∧也稱XOR運算子。它的規則是若參加運算的兩個二進位同號,則結果為0(假);異號則為1(真)。即0∧0=0,0∧1=1,1∧1=0。如: 即071∧052,結果為023(八進位制數)。 “異或”的意思是判斷兩個相應的位值是否為“
Python中“i+=i與i=i+i”的區別梳理:(引用、記憶體、可變引數、不可變引數)
Python中“i+=i與i=i+i”的區別梳理 一、 "i+=i"執行時資料記憶體的變化 當num+=num執行時,num原引用的記憶體空間中,根據空間中儲存的引數的資料型別是否為可變型別而進行變化,***可變的引數資料型別***有:列表、字典;***不可變引
談GPU的作用、原理及與CPU、DSP的區別
GPU是顯示卡的“心臟”,也就相當於CPU在電腦中的作用,它決定了該顯示卡的檔次和大部分效能,同時也是2D顯示卡和3D顯示卡的區別依據。2D顯示晶片在處理3D影象和特效時主要依賴CPU的處理能力,稱為“軟加速”。3D顯示晶片是將三維影象和特效處理功能集中在顯示晶片內,也即所謂
電磁波、無線電、802、WLAN及WiFi的區別與聯絡
一、電磁波、無線電、WLAN和WiFi的關係 電磁波 > 無線電 【+ 可見光】 > WLAN 【+ 電話 】> WiFi 【+藍芽】 參考:https://zh.wikipedia.org/wiki/%E6%97%A0%E7%BA%BF%E7%94%B5 二、80
MPEG-4與H264區別,編碼及應用
MPEG4於1998年11月公佈,原預計1999 年1月投入使用的國際標準MPEG4不僅是針對一定位元率下的視訊、音訊編碼,更加註重多媒體系統的互動性和靈活性。MPEG專家組的專家們正在為MPEG-4的制定努力工作。MPEG-4標準主要應用於視像電話(V