? Python Logging 日志記錄入門

Python Logging原來真的遠(yuǎn)比我想象的要復(fù)雜很多很多藐吮,學(xué)習(xí)路線堪比git。但是又繞不過去逃贝,alternatives又少谣辞,所以必須要予以重視,踏踏實實認(rèn)認(rèn)真真的來好好學(xué)學(xué)才行沐扳。

學(xué)習(xí)Logging的目的:
簡單腳本還好潦闲,print足夠。
但是稍微復(fù)雜點(diǎn)迫皱,哪怕是三四個文件加起來兩三百行代碼,調(diào)試也開始變復(fù)雜起來了。
再加上如果是后臺長期運(yùn)行的那種腳本卓起,運(yùn)行信息的調(diào)查更是復(fù)雜起來和敬。
一開始我還在各種查crontab的日志查看,或者是python后臺運(yùn)行查看戏阅,或者是python stdout的獲取等等昼弟,全都找錯了方向。
真正的解決方案在于正確的logging奕筐。
記錄好了的話舱痘,我不需要去找python的控制臺輸出stdout,也不需要找crontab的日志离赫,只需要查看log文件即可芭逝。
下面是python的logging學(xué)習(xí)記錄。

最簡單的日志輸出(無文件記錄)

import logging
 
logging.error("出現(xiàn)了錯誤")
logging.info("打印信息")
logging.warning("警告信息")

首先渊胸,忘掉logging.info()! 忘掉logging.basicConfig()!

網(wǎng)上各種關(guān)于python logging的文章實在是太不體諒新手了旬盯,logging這么復(fù)雜的東西竟然想表現(xiàn)得很簡單,還用各種簡單的東西做假象翎猛。
實際上我們真正要用起來的日志胖翰,絕對是不會直接用logging.info()logging.basicConfig()這樣的,這是此模塊的官方推出來迷惑人的——看似讓你一鍵上手切厘,快速看到結(jié)果萨咳,但是跟實際真的不搭!
所以為了后面解釋起來輕松疫稿,必須先警告這點(diǎn):忘記它們倆培他!
記住,唯一要用到logging.什么的而克,就只有logging.getLogger()這一次靶壮。

了解logging的工作流

不想上流程圖一類的東西,那樣反而更迷糊员萍。
簡單說吧:
logging模塊是會自動將你自定制的logger對象全局化的腾降,
也就是說,
你在自己的模塊里只要定義了一次某個logger碎绎,比如叫log螃壤,那么只要是在同一個模塊中運(yùn)行的其他文件都能讀取到它。
比如說筋帖,你在主文件main.py中自定義了一個logger奸晴,可能設(shè)置了什么輸出文件、輸出格式什么的日麸,然后你在main.py中會引用一些別的文件或模塊寄啼,比如sub.py逮光,那么在這個sub.py中你什么都不用設(shè)置,只要用一句logger = logging.getLogger('之前在main.py定義的日志名')即可獲得之前的一切自定義設(shè)置墩划。

當(dāng)然涕刚,被調(diào)用的文件(先稱為子模塊)中,用logging.getLogger('日志名')時乙帮,最好在日志名后加一個.子名稱這樣的杜漠,比如main.sub。這樣輸出的時候就會顯示出來某條日志記錄是來自于這個文件里了察净。當(dāng)然驾茴,.前面的父級logger必須名字一致,是會被識別出來的氢卡!
然后锈至,子日志還可以再子日志,甚至一個子模塊可以再讓所有函數(shù)各又一個子子日志异吻,比如main.sub.func1這樣的裹赴。logging都會根據(jù).識別出來上下級關(guān)系的。

這樣一說诀浪,實際上也就是class類繼承的那種機(jī)制了棋返。你按照父級名稱繼承,然后還可以改寫自己的新設(shè)置等雷猪。

了解了這些概念以后睛竣,才能來談代碼。實際上也就好理解多了求摇。

設(shè)置logger的方法

看來看去射沟,這篇文章說得比較全面也最清楚,以下很多都參考到它的內(nèi)容:Python 101: An Intro to logging

一般想要自定義一個logger与境,比如讓它輸出信息時按照什么格式顯示验夯,輸出到哪個文件,要不要輸出到屏幕一類摔刁,有三種方法可以達(dá)到設(shè)置:

  • 直接在python代碼里設(shè)置
  • 用外部的config.ini文件配置
  • 用python的dict字典配置

三種達(dá)到的目的都是一樣的挥转,字典用的人很少也不方便,配置文件比較好用只是.ini的語法不是很方便讀共屈,且不容易做到變量的動態(tài)設(shè)置绑谣,所以一般直接在python代碼里寫就好。

常用設(shè)置語句

以下是程序主入口文件的通用寫法拗引,注意借宵,一定要在主入口定義好logger,這樣其他所有的子模塊才能夠繼承到矾削。

#   main.py
import logging
import otherMod2   # 等下會調(diào)用到的子模塊

def main():
    """
    這個文件是程序的主入口
    """

    define_logger()

    log = logging.getLogger('exampleApp')

    # 輸出信息測試
    logger.info("Program started")
    result = otherMod2.add(7, 8)     # 這個是來自別的模塊的方法
    logger.info("Done!")

def define_logger():
    logger = logging.getLogger("exampleApp")
    logger.setLevel(logging.INFO)

    # 設(shè)置輸出格式
    formatter = logging.Formatter('\n%(asctime)s - %(name)s - %(levelname)s :\n\n\t %(message)s')
 
    # 設(shè)置日志文件處理器
    fh = logging.FileHandler("new_snake.log")
    fh.setFormatter(formatter)    # 為這個處理器添加格式

    # 設(shè)置屏幕stdout輸出處理器
    sh  = logging.StreamHandler(stream=None)
    sh.setFormatter(formatter)
 
    # 把處理器加到logger上
    logger.addHandler(fh)
    logger.addHandler(sh)
 
if __name__ == "__main__":
    main()

下面是子模塊中的調(diào)用方法(很簡單):

# otherMod2.py
import logging
 
module_logger = logging.getLogger("exampleApp.otherMod2")

def add(x, y):
    # 這里一句`getLogger`就繼承到父級的logger了
    logger = logging.getLogger("exampleApp.otherMod2.add")

    # 輸出測試
    logger.info("added %s and %s to get %s" % (x, y, x+y))
    return x+y

注意壤玫,主文件中豁护,在什么地方定義logger都可以,可以在main()里也可以在任何單獨(dú)的函數(shù)或類里垦细,無所謂择镇。只要在調(diào)用子模塊之前定義好了就可以了。一旦定義過括改,日志名就會被記下來,然后子模塊就可以輕松繼承到家坎。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘱能,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子虱疏,更是在濱河造成了極大的恐慌惹骂,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件做瞪,死亡現(xiàn)場離奇詭異对粪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)装蓬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門著拭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人牍帚,你說我怎么就攤上這事儡遮。” “怎么了暗赶?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵鄙币,是天一觀的道長。 經(jīng)常有香客問我蹂随,道長十嘿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任岳锁,我火速辦了婚禮绩衷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浸锨。我一直安慰自己唇聘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布柱搜。 她就那樣靜靜地躺著迟郎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪聪蘸。 梳的紋絲不亂的頭發(fā)上宪肖,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天表制,我揣著相機(jī)與錄音,去河邊找鬼控乾。 笑死么介,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜕衡。 我是一名探鬼主播壤短,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼慨仿!你這毒婦竟也來了久脯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤镰吆,失蹤者是張志新(化名)和其女友劉穎帘撰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體万皿,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摧找,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了牢硅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹬耘。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖唤衫,靈堂內(nèi)的尸體忽然破棺而出婆赠,到底是詐尸還是另有隱情,我是刑警寧澤佳励,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布休里,位于F島的核電站,受9級特大地震影響赃承,放射性物質(zhì)發(fā)生泄漏妙黍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一瞧剖、第九天 我趴在偏房一處隱蔽的房頂上張望拭嫁。 院中可真熱鬧,春花似錦抓于、人聲如沸做粤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怕品。三九已至,卻和暖如春巾遭,著一層夾襖步出監(jiān)牢的瞬間肉康,已是汗流浹背闯估。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吼和,地道東北人涨薪。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像炫乓,于是被迫代替她去往敵國和親刚夺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

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