2015-11-12 18 views
9

所以我在玩Google昨天發佈的Tensorflow庫,並遇到一個令人討厭的bug,它一直在困擾着我。Tensorflow導致日誌消息加倍

我所做的就是像往常一樣設置python日誌記錄功能,結果是,如果我導入張量流庫,控制檯中的所有消息都會開始加倍。有趣的是,如果您只使用logging.warn/info/..()函數,則會發生而不是

的,做雙消息的代碼示例:

import tensorflow as tf 
import logging 

logger = logging.getLogger('TEST') 
ch = logging.StreamHandler() 
logger.addHandler(ch) 

logger.warn('test') 

現在,我:

import tensorflow as tf 
import logging 

logging.warn('test') 

的代碼確實雙所有消息的一個例子一個簡單的人。我喜歡logging的功能,所以我使用它。 logger對象的設置和StreamHandler的添加是我看到其他人如何做到這一點的東西,但它看起來與它意味着如何使用它是一致的。但是,我並沒有對日誌庫有深入的瞭解,因爲它總是很有用。

所以,任何幫助解釋爲什麼發生雙倍的消息將是最有幫助的。

我使用Ubuntu 14.04.3 LTS和Python 2.7.6,但是錯誤發生在我試過的所有Python 2.7版本中。

+0

我有一個很難在Ubuntu 14.04中複製,這也與Python 2.7.6:你能否提供有關如何安裝TF更詳細一點的測試 : 蟒蛇testlog.py 警告:根源在哪裏? – dga

+0

啊!您的示例代碼中存在拼寫錯誤。最後一行應該是logger.warn('test')而不是logging.warn。現在我複製了它。答案更加清晰 - 堅持下去。 – dga

回答

12

我得到這樣的輸出:

test 
WARNING:TEST:test 

Tensorflow是使用日誌框架,並已建立了自己的處理程序,所以當你登錄,默認情況下,它傳播了裏面的父記錄處理程序tensorflow。您可以通過設置改變這種行爲:

logger.propagate = False 

又見duplicate output in simple python logging configuration

跟帖:這是方式tensorflow的意想不到的副作用是使用日誌包。我已經改變了HEAD的範圍,以「tensorflow」名稱來限制其內部記錄器,以避免這種污染。一天之內應該在github頭部。與此同時,logger.propagate解決方案將會工作,並且一旦修復完成就不會中斷,因此您應該安全。再次感謝您的發現!

+0

(我要檢查這是實際的目的還是一個錯誤 - 我從來沒有遇到過,或者對它有太多的想法)。 – dga

+0

謝謝你的回答,它按預期工作! – 5xum

+0

Tensorflow沒有使用getLogger(__ name__)的標準方式使用日誌包,這就是爲什麼你會看到命名空間衝突。我會爲此發送一個補丁,看看我們能否讓它更快樂。感謝您詢問這個問題! – dga