Python 日志輸出

打印日志是很多程序的重要需求揩抡,良好的日志輸出可以幫我們更方便的檢測程序運(yùn)行狀態(tài)藻懒。Python標(biāo)準(zhǔn)庫提供了logging模塊簇爆,讓我們也可以方便的在Python中打印日志癞松。

日志介紹

完整的使用方法可以參考標(biāo)準(zhǔn)庫文檔。這里做一下簡單介紹入蛆。

日志級別

日志級別有如下幾種响蓉。當(dāng)獲取根Logger的時候,默認(rèn)級別為NOTSET哨毁,這樣會顯示所有輸出枫甲。當(dāng)獲取非根Logger的時候,根Logger的默認(rèn)級別是WARNING,非根Logger會繼承這個級別想幻,只有WARNING以上的日志才會輸出粱栖。

級別 數(shù)值
CRITICAL 50
ERROR 40
WARNING 30
INFO 20
DEBUG 10
NOTSET 0

日志對象

日志對象通過模塊的getLogger(name)函數(shù)獲得,可以向該函數(shù)傳遞一個名稱脏毯。如果不傳遞名字的話闹究,就會獲取根Logger。

日志對象常用方法如下抄沮。

方法名 作用
setLevel(lvl) 設(shè)置日志級別
isEnabledFor(lvl) 檢查某級別的日志是否啟用
getEffectiveLevel() 獲取實際的日志級別
debug/warning/info/error(msg, *args, **kwargs) 輸出對應(yīng)級別的日志
log(lvl, msg, *args, **kwargs) 輸出指定級別的日志
addFilter(filt)/removeFilter(filt) 添加或刪除指定的過濾器
addHandler(hdlr)/removeHandler(hdlr) 添加或刪除指定的處理器

Handler對象

日志對象用于輸出日志跋核,而Handler對象用于指定日志向哪里輸出(文件、終端等等)叛买。Handler列表可以參考Handler類型砂代。

常用的Handler有以下幾種:

  • StreamHandler, 用于向標(biāo)準(zhǔn)輸入輸出流等輸出日志率挣。
  • FileHandler刻伊,用于向文件輸出日志。
  • NullHandler椒功,什么也不輸出捶箱。
  • RotatingFileHandler,向文件輸出日志动漾,如果文件到達(dá)指定大小丁屎,創(chuàng)建新文件并繼續(xù)輸出日志。

還有好多種Handler旱眯,可以向HTTP服務(wù)器發(fā)送日志晨川、向系統(tǒng)日志管理器寫入日志、向指定電子郵箱發(fā)送日志等Handler删豺。這里就不介紹了共虑。如果有相關(guān)需求請參考相應(yīng)文檔。

Formatter對象

Formatter對象用于格式化日志輸出呀页。格式化字符串使用傳統(tǒng)的%形式來格式化日志妈拌,可以參考官方文檔了解更多信息。

過濾器對象

過濾器對象用于過濾日志的輸出蓬蝶。

LogRecord對象

LogRecord對象基本上和我們沒多大關(guān)系尘分,簡單地說,我們輸出的每一條日志丸氛,就是一個LogRecord對象音诫。它有日志系統(tǒng)自動創(chuàng)建和使用。如果我們留心一下日志模塊的方法雪位,會發(fā)現(xiàn)有很多地方都要接受LogRecord參數(shù)。LogRecord有很多屬性信息,對日志打印有幫助雹洗,可以參考16.6.6. LogRecord Objects下面的屬性和格式化符的對照表香罐。例如%(asctime)s會生成人類可讀的時間戳,%(lineno)d返回當(dāng)前行號等等时肿。

模塊級別函數(shù)

日志模塊還包含了一些模塊級別的函數(shù)庇茫。簡單不完整列舉如下:

函數(shù)名 作用
getLogger(name=None) 獲取對應(yīng)名稱的Logger,如果不指定名稱會返回根Logger
debug/info等函數(shù) 在根Logger上打印對應(yīng)級別的日志信息
disable(lvl) 禁用某級別的日志打印
basicConfig(關(guān)鍵字參數(shù)) 這個函數(shù)可以快速設(shè)置日志的級別螃成、格式旦签、Handler、Formatter等

使用日志

前面都是紙面上的介紹寸宏,下面來真正使用日志模塊來打印日志宁炫。下面的代碼所用知識,前面都已介紹過氮凝。運(yùn)行代碼之后羔巢,可以驗證日志同時在終端輸出和文件中輸出。

import logging

# 創(chuàng)建Logger
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

# 創(chuàng)建Handler

# 終端Handler
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.DEBUG)

# 文件Handler
fileHandler = logging.FileHandler('log.log', mode='w', encoding='UTF-8')
fileHandler.setLevel(logging.NOTSET)

# Formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
consoleHandler.setFormatter(formatter)
fileHandler.setFormatter(formatter)

# 添加到Logger中
logger.addHandler(consoleHandler)
logger.addHandler(fileHandler)

# 打印日志
logger.debug('debug 信息')
logger.info('info 信息')
logger.warning('warn 信息')
logger.error('error 信息')
logger.critical('critical 信息')
logger.debug('%s 是自定義信息' % '這些東西')

運(yùn)行結(jié)果罩阵。

2017-04-04 21:45:16,742 - root - DEBUG - debug 信息
2017-04-04 21:45:16,742 - root - INFO - info 信息
2017-04-04 21:45:16,742 - root - WARNING - warn 信息
2017-04-04 21:45:16,742 - root - ERROR - error 信息
2017-04-04 21:45:16,742 - root - CRITICAL - critical 信息
2017-04-04 21:45:16,742 - root - DEBUG - 這些東西 是自定義信息

外部配置

前面都是在代碼中配置日志的輸出竿秆,我們還可以將配置寫到配置文件中,然后傳遞給日志模塊稿壁。舊式程序會使用conf格式配置文件幽钢,不過這種配置文件比較傳統(tǒng),所以就不介紹了傅是。

自Python 3.2起匪燕,引入了一種新的基于鍵值對的配置方式。這種新方式的優(yōu)點是配置文件非常靈活落午,我們可以使用XML谎懦、YAML、JSON等格式存儲配置溃斋,也可以從網(wǎng)絡(luò)上接收序列化的Python對象當(dāng)做配置對象界拦。總之梗劫,想怎么來就怎么來享甸。我們下面就介紹這種新方式。

具體的鍵值對需要參考官方文檔梳侨。例如下面就是Python官方給出的一個YAML格式的配置文件蛉威。

version: 1
formatters:
  simple:
    format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: simple
    stream: ext://sys.stdout
loggers:
  main:
    level: DEBUG
    handlers: [console]
    propagate: no
root:
  level: DEBUG
  handlers: [console]

然后引入logging.config模塊,并將配置文件傳遞給logging.config模塊的dictConfig方法走哺。這樣就做好了日志打印的準(zhǔn)備工作了蚯嫌。

import logging.config

logging.config.dictConfig('config.yaml')

logger = logging.getLogger('fuck')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子择示,更是在濱河造成了極大的恐慌束凑,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栅盲,死亡現(xiàn)場離奇詭異汪诉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谈秫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門扒寄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拟烫,你說我怎么就攤上這事该编。” “怎么了构灸?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵上渴,是天一觀的道長。 經(jīng)常有香客問我喜颁,道長稠氮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任半开,我火速辦了婚禮隔披,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寂拆。我一直安慰自己奢米,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布纠永。 她就那樣靜靜地躺著鬓长,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尝江。 梳的紋絲不亂的頭發(fā)上涉波,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音炭序,去河邊找鬼啤覆。 笑死,一個胖子當(dāng)著我的面吹牛惭聂,可吹牛的內(nèi)容都是我干的窗声。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼辜纲,長吁一口氣:“原來是場噩夢啊……” “哼笨觅!你這毒婦竟也來了拦耐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤屋摇,失蹤者是張志新(化名)和其女友劉穎揩魂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炮温,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年牵舵,在試婚紗的時候發(fā)現(xiàn)自己被綠了柒啤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡畸颅,死狀恐怖担巩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情没炒,我是刑警寧澤涛癌,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站送火,受9級特大地震影響拳话,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜种吸,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一弃衍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坚俗,春花似錦镜盯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恩闻,卻和暖如春艺糜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背判呕。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工倦踢, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侠草。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓辱挥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親边涕。 傳聞我的和親對象是個殘疾皇子晤碘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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

  • 簡單的將日志打印到屏幕 輸出:WARNING:root:warning messageERROR:root:err...
    狗狗胖妞閱讀 1,856評論 0 0
  • 本文翻譯自logging howto 基礎(chǔ)教程 日志是跟蹤軟件運(yùn)行時發(fā)生事件的一種手段褂微。Python開發(fā)者在代碼中...
    大蟒傳奇閱讀 4,247評論 0 17
  • 本文首發(fā)于Gevin的博客 原文鏈接:Python 日志功能詳解 未經(jīng) Gevin 授權(quán),禁止轉(zhuǎn)載 軟件開發(fā)中通過...
    Gevin閱讀 4,872評論 1 24
  • logging模塊介紹: logging是python內(nèi)置的標(biāo)準(zhǔn)庫模塊园爷,模塊提供不同的日志級別宠蚂,并可以采用不同的方...
    4ffde5305e8f閱讀 2,821評論 0 2
  • 請讓時間倒退回到2011年,剛剛脫離3年漫漫學(xué)習(xí)苦海的我歡欣雀躍地奔向了大學(xué)校門童社,興奮求厕、激動、忐忑扰楼、好奇呀癣、不安種種...
    盟盟zm閱讀 939評論 9 19