Python 日志模塊 logging rotate 的坑兒

本文的坑兒依啰,主要是在日志滾動(dòng)這一塊,當(dāng)然案训,如果你的應(yīng)用一直在打日志买置,系統(tǒng)時(shí)間一直是正確的,那么 python(2.6.6) 自己的日志模塊是 ok 的强霎。

先說現(xiàn)象:
初始化日志按照時(shí)間滾動(dòng)忿项,TimedRotatingFileHandler(when='D', interval=1...)
在 2016-05-23 查看 cap-sync.log 日志的滾動(dòng)情況,發(fā)現(xiàn)下面的詭異現(xiàn)象:

ls -l
head -n 1cap-sync.log.2016-05-19
tail -n 1cap-sync.log.2016-05-19
head -n 1cap-sync.log.2016-05-20
tail -n 1cap-sync.log.2016-05-20
head -n 1cap-sync.log
tail -n 1cap-sync.log
 
total30460
-rw-rw-r-- 1 admin admin     1440 May 23 10:56 cap-sync.log
-rw-rw-r-- 1 admin admin   531572 May 20 18:34 cap-sync.log.2016-05-19
-rw-rw-r-- 1 admin admin     1330 May 23 10:56 cap-sync.log.2016-05-20

2016-05-20 09:28:40,411 - CAP-Sync - INFO - Consume has failed record in JMQ:{"action":"add","appCode":"config","ips":["10.255.255.1"]}.Put this message into retry queue
2016-05-20 18:34:16,265 - CAP-Sync - INFO - Consume OK with JMQ: {"action":"remove","appCode":"big.new","ips":["10.255.255.2"]}.

2016-05-22 21:34:40,133 - CAP-Sync - INFO - Consume OK with JMQ:{"action":"remove","appCode":"zk","ips":["10.1255.255.2"]}.
2016-05-23 10:56:56,373 - CAP-Sync - INFO - Consume OK with JMQ:{"action":"add","appCode":"service","ips":["10.255.255.1"]}.

2016-05-22 21:34:40,148 - JMQ-api - INFO - produce JMQ success! Detail Info:{"action":"remove","appCode":"zk","ips":["10.255.255.2"]}
2016-05-23 10:56:56,384 - JMQ-api - INFO - produce JMQ success! Detail Info:{"action":"add","appCode":"service","ips":["10.255.255.1"]} 

詭異點(diǎn):

  • 21城舞、22號(hào)沒有日志備份
  • 19號(hào)的日志里面轩触,都是20號(hào)的日志;
  • 23號(hào)同時(shí)修改了 cap-sync.log.2016-05-20 以及 cap-sync.log 文件
  • cap-sync.log.2016-05-20 以及 cap-sync.log 文件里分別記錄了應(yīng)該記錄在 cap-sync.log 里的日志

網(wǎng)上查到的已知 BUGs:

  • 默認(rèn) python 庫中的 logging.handlers.TimedRotatingFileHandler 會(huì)在 logger 初始化階段不生成 suffix家夺,這樣一旦程序重啟就會(huì)導(dǎo)致上次啟動(dòng)的日志被覆蓋脱柱。
    解決辦法: 在初始化 TimedRotatingFileHandler 之后,設(shè)置 suffix

handler.suffix = "%Y-%m-%d"```

  • 這個(gè)類實(shí)現(xiàn)切換日志的時(shí)候秦踪,使用了當(dāng)前時(shí)間 + interval 來計(jì)算下一次的切換時(shí)間褐捻,但可能當(dāng)前時(shí)間相對(duì)于整點(diǎn)是有偏移的,比如應(yīng)該在 10:00:00 切日志椅邓,但直到 10:00:05 才有日志寫柠逞,也就是這個(gè)點(diǎn)才開始切日志,這樣就帶來 5s 的偏移景馁,并且可能程序跑得越久板壮,偏移越大。但看代碼合住,對(duì)于按 MIDNIGHT 或 weekday 來切是有做校正的绰精。
  • 用 TimedRotatingFileHandler 的目的是讓其自動(dòng)在日志文件名后面加上日期時(shí)間,可以按秒透葛、分笨使、時(shí)、天僚害、周或者其倍數(shù)來設(shè)置硫椰,BUG 出現(xiàn)的場(chǎng)景是:手動(dòng)設(shè)置時(shí)間,并把時(shí)間往未來時(shí)間調(diào)(比如把2012-03-15調(diào)成2014-03-15),這時(shí)就出問題了靶草,這時(shí)產(chǎn)生每條日志后會(huì)產(chǎn)生一個(gè)日志文件蹄胰,這并不是我們想要的效果,如果把當(dāng)前時(shí)間再往歷史時(shí)間調(diào)(比如把2012-03-15調(diào)成2010-03-15)奕翔,這時(shí)也會(huì)產(chǎn)生問題:所有產(chǎn)生的日志都會(huì)記錄到一個(gè)沒有日期后綴的文件裕寨,并不會(huì)按日期分類。如果時(shí)間是正確的并按正常的流程走并不會(huì)產(chǎn)生問題派继,所以想看看 logging 是怎么實(shí)現(xiàn)的宾袜,看了其源碼:\lib\logging\handlers.py,果然不出所料互艾,它的設(shè)計(jì)是有問題的试和,根本不考慮手動(dòng)調(diào)時(shí)間或者時(shí)間可能不對(duì)需要同步的情況

根本原因:
Addhandler讯泣,會(huì)多次追加纫普,也就是說在 a.py 里 import b 的時(shí)候,已經(jīng)在 logger 實(shí)例里加了一個(gè) handler好渠,
然后 a.py 去初始化一個(gè)同名的 logger 時(shí)昨稼,又追加了一個(gè)同樣的 handler。

所以產(chǎn)生的效果是:

  1. 沒有 rotate 的情況下拳锚,一條日志會(huì)被打印N次(N 是全部代碼里初始化 logger 的次數(shù))
  2. Rotate 的時(shí)候假栓,會(huì)導(dǎo)致同時(shí)往昨天以及今天的日志文件里寫日志
    這個(gè)情形,沒想明白霍掺,為什么會(huì)往昨天的日志文件繼續(xù)寫日志

解決方法:

  1. 確保只有一個(gè) get_logger 的實(shí)例
  2. 按天 rotate匾荆,盡量用 midnight
  3. 在 global_logger.py 中,addhandler 之前先判斷當(dāng)前 handler 個(gè)數(shù):
    if not len(logger.handlers):
        logger.addHandler(handler)

參考資料:
http://stackoverflow.com/questions/6333916/python-logging-ensure-a-handler-is-added-only-once

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杆烁,一起剝皮案震驚了整個(gè)濱河市牙丽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兔魂,老刑警劉巖烤芦,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異析校,居然都是意外死亡构罗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門智玻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遂唧,“玉大人,你說我怎么就攤上這事吊奢「桥恚” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谬泌。 經(jīng)常有香客問我滔韵,道長,這世上最難降的妖魔是什么掌实? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任陪蜻,我火速辦了婚禮,結(jié)果婚禮上贱鼻,老公的妹妹穿的比我還像新娘宴卖。我一直安慰自己,他們只是感情好邻悬,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布症昏。 她就那樣靜靜地躺著,像睡著了一般父丰。 火紅的嫁衣襯著肌膚如雪肝谭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天蛾扇,我揣著相機(jī)與錄音攘烛,去河邊找鬼。 笑死镀首,一個(gè)胖子當(dāng)著我的面吹牛坟漱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播更哄,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼芋齿,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了成翩?” 一聲冷哼從身側(cè)響起觅捆,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捕传,沒想到半個(gè)月后惠拭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庸论,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年职辅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聂示。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡域携,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鱼喉,到底是詐尸還是另有隱情秀鞭,我是刑警寧澤趋观,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站锋边,受9級(jí)特大地震影響皱坛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜豆巨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一剩辟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧往扔,春花似錦贩猎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蝗罗,卻和暖如春艇棕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绿饵。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工欠肾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓶颠,地道東北人拟赊。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像粹淋,于是被迫代替她去往敵國和親吸祟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 本篇文章主要對(duì) python logging 的介紹加深理解桃移。更主要是 討論在多進(jìn)程環(huán)境下如何使用logging ...
    doudou0o閱讀 40,958評(píng)論 52 42
  • logging模塊介紹: logging是python內(nèi)置的標(biāo)準(zhǔn)庫模塊屋匕,模塊提供不同的日志級(jí)別,并可以采用不同的方...
    4ffde5305e8f閱讀 2,821評(píng)論 0 2
  • Python logging 模塊 參考 http://blog.csdn.net/zyz511919766/ar...
    ktide閱讀 888評(píng)論 0 2
  • 本文章是我大概三年前借杰,在上家單位使用 Python 工作時(shí)結(jié)合官方文檔做的整理」牵現(xiàn)在 Python 官方文檔聽說已...
    好吃的野菜閱讀 216,087評(píng)論 14 232
  • iOS 開發(fā)之照片框架詳解iOS 開發(fā)之照片框架詳解之二 —— PhotoKit 詳解(上)iOS 開發(fā)之照片框架...
    4164fccdcf1c閱讀 238評(píng)論 0 2