Python的logging模塊的復(fù)習(xí)和使用

在之前的多個項目中都有用到過logging模塊,雖然用過,但沒有研究過,只是在每個代碼文件中使用logger=logging.getLogger(__name__)這樣簡單粗暴的方法。

在這次的使用經(jīng)歷中,覺得logging模塊真的很不錯。

logging

使用logging前,必須先要了解它的重要概念。

  • Logging Levels
  • Logger Objects
  • Handler Objects
  • Formatter Objects
  • Filter Objects

Level

Level 級別。只有在日志消息的級別大于logger和handler設(shè)定的級別,才會顯示。

級別 何時使用
NOTSET 不設(shè)置級別 0
DEBUG 詳細(xì)信息,調(diào)試時 10
INFO 證明事情按預(yù)期工作。 20
WARNING 表明發(fā)生了一些意外,或者不久的將來會發(fā)生問題(如‘磁盤滿了’)。軟件還是在正常工作。 30
ERROR 由于更嚴(yán)重的問題,軟件已不能執(zhí)行一些功能了。 40
CRITICAL 嚴(yán)重錯誤,表明軟件已不能繼續(xù)運(yùn)行了。 50

Logger

Logger 記錄器,暴露了應(yīng)用程序代碼能直接使用的接口。

Logger是一個樹形層級結(jié)構(gòu),在使用接口debug,info,warn,error,critical之前必須創(chuàng)建Logger實例,即創(chuàng)建一個記錄器,如果沒有顯式的進(jìn)行創(chuàng)建,則默認(rèn)創(chuàng)建一個root logger,并應(yīng)用默認(rèn)的日志級別(WARN),處理器Handler(StreamHandler,即將日志信息打印輸出在標(biāo)準(zhǔn)輸出上),和格式化器Formatter(默認(rèn)的格式即為第一個簡單使用程序中輸出的格式)。

創(chuàng)建方法: logger = logging.getLogger(name=None)。如果不指定name則返回root logger對象。

常用方法如下:

方法 說明
addHandler(self, hdlr) Add the specified handler to this logger.
removeHandler(self, hdlr) Remove the specified handler from this logger.
setLevel(self, level) Set the logging level of this logger.

Handler

Handler 處理器,將(記錄器產(chǎn)生的)日志記錄發(fā)送至合適的目的地。

比較常用的有三個,StreamHandler,F(xiàn)ileHandler,NullHandler,詳情可以訪問地址

Handler處理器類型如下:

  • StreamHandler
  • FileHandler
  • NullHandler
  • WatchedFileHandler
  • RotatingFileHandler
  • TimedRotatingFileHandler
  • SocketHandler
  • DatagramHandler
  • SysLogHandler
  • NTEventLogHandler
  • SMTPHandler
  • MemoryHandler
  • HTTPHandler

Filter

過濾器,提供了更好的粒度控制,它可以決定輸出哪些日志記錄。

使用Formatter對象設(shè)置日志信息最后的規(guī)則、結(jié)構(gòu)和內(nèi)容,默認(rèn)的時間格式為%Y-%m-%d %H:%M:%S。

創(chuàng)建方法: formatter = logging.Formatter(fmt=None, datefmt=None)

其中,fmt是消息的格式化字符串,datefmt是日期字符串。如果不指明fmt,將使用'%(message)s'。如果不指明datefmt,將使用ISO8601日期格式。

Formatter

格式化器,指明了最終輸出中日志記錄的布局。

Handlers和Loggers可以使用Filters來完成比級別更復(fù)雜的過濾。Filter基類只允許特定Logger層次以下的事件。例如用‘A.B’初始化的Filter允許Logger ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’等記錄的事件,logger‘A.BB’, ‘B.A.B’ 等就不行。 如果用空字符串來初始化,所有的事件都接受。

格式 描述
%(levelno)s 打印日志級別的數(shù)值
%(levelname)s 打印日志級別名稱
%(pathname)s 打印當(dāng)前執(zhí)行程序的路徑
%(filename)s 打印當(dāng)前執(zhí)行程序名稱
%(funcName)s 打印日志的當(dāng)前函數(shù)
%(lineno)d 打印日志的當(dāng)前行號
%(asctime)s 打印日志的時間
%(thread)d 打印線程id
%(threadName)s 打印線程名稱
%(process)d 打印進(jìn)程ID
%(message)s 打印日志信息

使用過程

在項目啟動中導(dǎo)入logging模塊,然后進(jìn)行配置,logging標(biāo)準(zhǔn)模塊支持三種配置方式: dictConfig,fileConfig,listen。其中,dictConfig是通過一個字典進(jìn)行配置Logger,Handler,F(xiàn)ilter,F(xiàn)ormatter;fileConfig則是通過一個文件進(jìn)行配置;而listen則監(jiān)聽一個網(wǎng)絡(luò)端口,通過接收網(wǎng)絡(luò)數(shù)據(jù)來進(jìn)行配置。當(dāng)然,除了以上集體化配置外,也可以直接調(diào)用Logger,Handler等對象中的方法在代碼中來顯式配置。

basicConfig關(guān)鍵字參數(shù)

關(guān)鍵字 描述
filename 創(chuàng)建一個FileHandler,使用指定的文件名,而不是使用StreamHandler。
filemode 如果指明了文件名,指明打開文件的模式(如果沒有指明filemode,默認(rèn)為'a')。
format handler使用指明的格式化字符串。
datefmt 使用指明的日期/時間格式。
level 指明根logger的級別。
stream 使用指明的流來初始化StreamHandler。該參數(shù)與'filename'不兼容,如果兩個都有,'stream'被忽略。

例子:
logging.yaml

logging:
    version: 1
    formatters:
      brief:
        format: '%(message)s'
      default:
        format: '%(asctime)s %(levelname)-8s %(name)-15s %(message)s'
        datefmt: '%Y-%m-%d %H:%M:%S'
      fluent_fmt:
        '()': fluent.handler.FluentRecordFormatter
        format:
          loglevel: '%(levelname)s'
          hostname: '%(hostname)s'
          where: '%(module)s.%(funcName)s'
          stack_trace: '%(exc_text)s'
    handlers:
        console:
            class : logging.StreamHandler
            level: DEBUG
            formatter: default
            stream: ext://sys.stdout
        fluent_dev:
            class: fluent.handler.FluentHandler
            host: 127.0.0.1
            port: 24224
            tag: test.dev
            formatter: fluent_fmt
            level: DEBUG
        fluent_prod:
            class: fluent.handler.FluentHandler
            host: 127.0.0.1
            port: 24224
            tag: test.prod
            formatter: fluent_fmt
            level: DEBUG
        null:
            class: logging.NullHandler

    loggers:
        amqp:
            handlers: [null]
            propagate: False
        conf:
            handlers: [null]
            propagate: False
        dev:
            handlers: [console, fluent_dev]
            level: DEBUG
            propagate: False
        prod:
            handlers: [console, fluent_prod]
            level: DEBUG
            propagate: False
        '': # root logger
            handlers: [console]
            level: DEBUG
            propagate: False

導(dǎo)入配置方法:

import yaml
import logging
import logging.config

with open('logging.yaml') as fd:
    conf = yaml.load(fd)

logging.config.dictConfig(conf['logging'])

獲取logger

logger = logging.getLogger(loggername)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內(nèi)容

  • 本文章是我大概三年前,在上家單位使用 Python 工作時結(jié)合官方文檔做的整理?,F(xiàn)在 Python 官方文檔聽說已...
    好吃的野菜閱讀 217,429評論 14 232
  • 本文首發(fā)于Gevin的博客 原文鏈接:Python 日志功能詳解 未經(jīng) Gevin 授權(quán),禁止轉(zhuǎn)載 軟件開發(fā)中通過...
    Gevin閱讀 4,977評論 1 24
  • Python logging 模塊 參考 http://blog.csdn.net/zyz511919766/ar...
    ktide閱讀 907評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,829評論 18 139
  • λ太大,通常會欠擬合;λ等于0,相當(dāng)于沒有正則化項,通常會過擬合;選擇合適的λ,才會很好的擬合數(shù)據(jù)。該如何選擇?=...
    天際神游閱讀 1,678評論 0 0