欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python標準日志模塊logging的使用方法

 更新時間:2013年11月01日 09:48:47   作者:  
python的標準庫里的日志系統(tǒng)從Python2.3開始支持。只要import logging這個模塊即可使用。

最近寫一個爬蟲系統(tǒng),需要用到python的日志記錄模塊,于是便學習了一下。
python的標準庫里的日志系統(tǒng)從Python2.3開始支持。只要import logging這個模塊即可使用。如果你想開發(fā)一個日志系統(tǒng), 既要把日志輸出到控制臺, 還要寫入日志文件,只要這樣使用:

復制代碼 代碼如下:

import logging
# 創(chuàng)建一個logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 創(chuàng)建一個handler,用于寫入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
# 再創(chuàng)建一個handler,用于輸出到控制臺
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 定義handler的輸出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 給logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)
# 記錄一條日志
logger.info('foorbar')

結(jié)合上面的例子,我們說下幾個最常使用的API:
  logging.getLogger([name])
  返回一個logger實例,如果沒有指定name,返回root logger。只要name相同,返回的logger實例都是同一個而且只有一個,即name和logger實例是一一對應的。這意味著,無需把logger實例在各個模塊中傳遞。只要知道name,就能得到同一個logger實例。
  Logger.setLevel(lvl)
  設(shè)置logger的level, level有以下幾個級別:
    
  級別高低順序:NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
  如果把looger的級別設(shè)置為INFO, 那么小于INFO級別的日志都不輸出, 大于等于INFO級別的日志都輸出  
復制代碼 代碼如下:

logger.debug("foobar")    # 不輸出  
logger.info("foobar")        # 輸出 
logger.warning("foobar")  # 輸出 
logger.error("foobar")      # 輸出 
logger.critical("foobar")    # 輸出 

Logger.addHandler(hdlr)
通過handler對象可以把日志內(nèi)容寫到不同的地方。比如簡單的StreamHandler就是把日志寫到類似文件的地方。python提供了十幾種實用handler,比較常用有:
復制代碼 代碼如下:

StreamHandler: 輸出到控制臺
 FileHandler:   輸出到文件
BaseRotatingHandler 可以按時間寫入到不同的日志中。比如將日志按天寫入不同的日期結(jié)尾的文件文件。
SocketHandler 用TCP網(wǎng)絡(luò)連接寫LOG
DatagramHandler 用UDP網(wǎng)絡(luò)連接寫LOG
SMTPHandler 把LOG寫成EMAIL郵寄出去

logging.basicConfig([**kwargs])* 這個函數(shù)用來配置root logger, 為root logger創(chuàng)建一個StreamHandler,設(shè)置默認的格式。* 這些函數(shù): logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical() 如果調(diào)用的時候發(fā)現(xiàn)root logger沒有任何handler,會自動調(diào)用basicConfig添加一個handler* 如果root logger已有handler,這個函數(shù)不做任何事情使用basicConfig來配置root logger的輸出格式和level:
復制代碼 代碼如下:

import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')

ogger對象直接提供日志接口。formatter描述日志的格式。handler把日志寫到不同的地方,你可以把日志保存成本地文件,也可以每個小時寫一個日志文件,還可以把日志通過socket傳到別的機器上。
從最簡單的formatter對象來看。formatter指定的是每一條日志記錄的抬頭信息,也就是你可以指定日志記錄的時間格式、進程號、文件名、函數(shù)名等信息??梢杂眠@個方法來創(chuàng)建一個formatter對象:
復制代碼 代碼如下:

logging.Formatter.__init__( fmt=None, datefmt=None)

fmt參數(shù)指定進程號、文件名、函數(shù)名等信息是否出現(xiàn)以及格式, datefmt為日期時間格式,默認的日期格式精確到微秒,例如‘2003-07-08 16:49:45,896'。fmt中可以指定多個字段,每個字段的格式為“%(<dictionary key>)s”, 例如你想打印時間、日志級別、日志信息可以用下面的format:
復制代碼 代碼如下:

'%(asctime)s - %(levelname)s - %(message)s'

在記錄爬蟲系統(tǒng)日志的時候需要定義記錄日志的級別,級別越高表示打出來的日志越詳細。我們可以用一個字典來設(shè)置不同級別對應的不同日志信息:
復制代碼 代碼如下:

#用字典保存日志級別
format_dict = {
   1 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
   2 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
   3 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
   4 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
   5 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
}

將本文開始的代碼封裝在一個類中
復制代碼 代碼如下:

#開發(fā)一個日志系統(tǒng), 既要把日志輸出到控制臺, 還要寫入日志文件  
class Logger():
    def __init__(self, logname, loglevel, logger):
        '''
           指定保存日志的文件路徑,日志級別,以及調(diào)用文件
           將日志存入到指定的文件中
        '''

        # 創(chuàng)建一個logger
        self.logger = logging.getLogger(logger)
        self.logger.setLevel(logging.DEBUG)

        # 創(chuàng)建一個handler,用于寫入日志文件
        fh = logging.FileHandler(logname)
        fh.setLevel(logging.DEBUG)

        # 再創(chuàng)建一個handler,用于輸出到控制臺
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)

        # 定義handler的輸出格式
        #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        formatter = format_dict[int(loglevel)]
        fh.setFormatter(formatter)
        ch.setFormatter(formatter)

        # 給logger添加handler
        self.logger.addHandler(fh)
        self.logger.addHandler(ch)

   
    def getlog(self):
        return self.logger

再通過以下方式調(diào)用,便是一個簡單的日志系統(tǒng)了
復制代碼 代碼如下:

logger = Logger(logname='log.txt', loglevel=1, logger="fox").getlog()

相關(guān)文章

  • 最新pycharm安裝教程

    最新pycharm安裝教程

    這篇文章主要介紹了最新pycharm安裝教程,需要的朋友可以參考下
    2020-11-11
  • 詳解Django配置JWT認證方式

    詳解Django配置JWT認證方式

    這篇文章主要介紹了Django 配置JWT認證方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • Python 如何求矩陣的逆

    Python 如何求矩陣的逆

    這篇文章主要介紹了Python 如何求矩陣的逆案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python對數(shù)據(jù)進行插值和下采樣的方法

    Python對數(shù)據(jù)進行插值和下采樣的方法

    今天小編就為大家分享一篇Python對數(shù)據(jù)進行插值和下采樣的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python實現(xiàn)圖算法、堆操作和并查集代碼實例

    Python實現(xiàn)圖算法、堆操作和并查集代碼實例

    這篇文章主要介紹了Python實現(xiàn)圖算法、堆操作和并查集代碼實例,圖算法、堆操作和并查集是計算機科學中常用的數(shù)據(jù)結(jié)構(gòu)和算法,它們在解決各種實際問題中具有重要的應用價值,需要的朋友可以參考下
    2023-08-08
  • Python version 2.7 required, which was not found in the registry

    Python version 2.7 required, which was not found in the regi

    這篇文章主要介紹了安裝PIL庫時提示錯誤Python version 2.7 required, which was not found in the registry問題的解決方法,需要的朋友可以參考下
    2014-08-08
  • zookeeper python接口實例詳解

    zookeeper python接口實例詳解

    這篇文章主要介紹了zookeeper python接口實例詳解,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Python 使用ConfigParser操作ini配置文件

    Python 使用ConfigParser操作ini配置文件

    這篇文章主要介紹了Python 使用ConfigParser操作ini配置文件的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • 在 Python 中使用 MQTT的方法

    在 Python 中使用 MQTT的方法

    這篇文章主要介紹了在 Python 中使用 MQTT的方法,幫助大家更好的理解和學習python,感興趣的朋友可以了解下
    2020-08-08
  • Python入門之三角函數(shù)全解【收藏】

    Python入門之三角函數(shù)全解【收藏】

    這篇文章主要介紹了Python入門之三角函數(shù)全解【收藏】,還是比較全面的,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11

最新評論