1. 程式人生 > >python logging應用及與print的區別、log監控api呼叫、format的使用

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.62.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+=ii=i+i”的區別梳理:(引用記憶體可變引數不可變引數)

Python中“i+=i與i=i+i”的區別梳理 一、 "i+=i"執行時資料記憶體的變化 當num+=num執行時,num原引用的記憶體空間中,根據空間中儲存的引數的資料型別是否為可變型別而進行變化,***可變的引數資料型別***有:列表、字典;***不可變引

談GPU的作用原理CPUDSP的區別

GPU是顯示卡的“心臟”,也就相當於CPU在電腦中的作用,它決定了該顯示卡的檔次和大部分效能,同時也是2D顯示卡和3D顯示卡的區別依據。2D顯示晶片在處理3D影象和特效時主要依賴CPU的處理能力,稱為“軟加速”。3D顯示晶片是將三維影象和特效處理功能集中在顯示晶片內,也即所謂

電磁波無線電802WLANWiFi的區別聯絡

一、電磁波、無線電、WLAN和WiFi的關係 電磁波 > 無線電 【+ 可見光】 > WLAN 【+ 電話 】> WiFi 【+藍芽】 參考:https://zh.wikipedia.org/wiki/%E6%97%A0%E7%BA%BF%E7%94%B5   二、80

MPEG-4H264區別,編碼應用

  MPEG4於1998年11月公佈,原預計1999 年1月投入使用的國際標準MPEG4不僅是針對一定位元率下的視訊、音訊編碼,更加註重多媒體系統的互動性和靈活性。MPEG專家組的專家們正在為MPEG-4的制定努力工作。MPEG-4標準主要應用於視像電話(V