2012-08-09 32 views
2

我在Linux Ubuntu 12.04系統。 我一直在使用這個代碼記錄所有輸出和錯誤+在INFO水平提升到一個文件的其他記錄..蟒蛇 - 登錄標準輸出,但獲得第二個空行每個條目

class LogFile(object): 
    def __init__(self, name=None): 
     self.logger = logging.getLogger(name) 

    def write(self, msg, level=logging.INFO): 
     self.logger.log(level, msg) 

    def flush(self): 
     for handler in self.logger.handlers: 
      handler.flush() 

logging.basicConfig(level=logging.INFO, 
        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 
        datefmt='%m-%d-%y %H:%M:%S', 
        filename='logging.log') 
sys.stdout = LogFile('stdout') 
sys.stderr = LogFile('stderr') 

出於某種原因,每當我獲得入門它總是跟着一個空行,這裏是一個我的日誌輸出很小:

08-09-12 09:52:54 stdout  INFO  CheckCon: Checking Portal access. 
08-09-12 09:52:54 stdout  INFO  

08-09-12 09:52:54 stdout  INFO  CheckCon: Portal ping successful. 
08-09-12 09:52:54 stdout  INFO  

08-09-12 09:53:08 stderr  INFO  Bottle server starting up (using PasteServer())... 

08-09-12 09:53:08 stderr  INFO  Listening on http://0.0.0.0:8654/ 

08-09-12 09:53:08 stderr  INFO  Hit Ctrl-C to quit. 


08-09-12 09:53:08 stdout  INFO  URI: Generated https://***** 
08-09-12 09:53:08 stdout  INFO  

08-09-12 09:53:08 stdout  INFO  CheckCon: Checking Portal access. 
08-09-12 09:53:08 stdout  INFO  

08-09-12 09:53:08 stdout  INFO  serving on 0.0.0.0:8654 view at http://127.0.0.1:8654 
08-09-12 09:53:08 stdout  INFO  

08-09-12 09:53:08 stdout  INFO  CheckCon: Google ping successful. 
08-09-12 09:53:08 stdout  INFO  

這是它在文件中的樣子,它們都是空的stdout行,然後是整個空行。 如果您發現瓶子服務器的輸出似乎沒有空行,但每行之間仍然有空行。

任何人都知道是什麼原因造成的,或者我可以如何防止它?

編輯:

從建議,我已經改變了我的所有打印到logging.info,我仍然有一個瓶子和粘貼服務器定期做打印的問題:\

所以我現在修改格式的日誌format='%(asctime)s %(levelname)-4s: %(message)s'

08-09-12 12:44:40 INFO: URI: Generated https://**** 
08-09-12 12:44:40 INFO: CheckCon: Checking Portal access. 
08-09-12 12:44:40 INFO: serving on 0.0.0.0:9002 view at http://127.0.0.1:9002 
08-09-12 12:44:40 INFO: 

08-09-12 12:44:40 INFO: CheckCon: Google ping successful. 
08-09-12 12:44:40 INFO: FullW: opening url: **** 
08-09-12 12:44:40 INFO: FullW: showing. 
08-09-12 12:44:40 INFO: LOOP: starting. 

從我可以看到更多的空行也因爲空信息行,所以現在更接近獲得..

編輯澄清輸出: 有趣的一點:

+++08-09-12 13:01:04 stdout  INFO  serving on 0.0.0.0:9002 view at  http://127.0.0.1:9002+++ 
+++08-09-12 13:01:04 stdout  INFO  
+++ 

最後編輯:

改變了我寫檢查,如果味精的長度在2個字符,而且消除了空行..仍然不是100%確定的原因。

def write(self, msg, level=logging.INFO): 
    if len(msg) < 2: 
     pass 
    else: 
     self.logger.log(level, msg) 
+0

另外,我建議把'level ='參數放到'__init __()',不要寫'()'。 – glglgl 2012-08-09 08:51:31

+0

對不起glglgl我不明白你的意思? – 2012-08-09 10:53:21

+0

爲了清楚起見,它的格式設置爲'+++%(asctime)s%(name)-12s%(levelname)-8s%(message)s +++'的運行情況如何? – Deestan 2012-08-09 10:57:34

回答

0

這是由於print如何工作。

我修改了您的示例,以便我在write()方法中使用print (level, msg)

它讓我看到以下內容:

>>> x=LogFile("foo") 
>>> print >>x, "123\n321\n444", "321", "222", 
(20, '123\n321\n444') 
(20, ' ') 
(20, '321') 
(20, ' ') 
(20, '222') 
>>> print >>x, "123\n321\n444", "321", "222" 
(20, ' ') 
(20, '123\n321\n444') 
(20, ' ') 
(20, '321') 
(20, ' ') 
(20, '222') 
(20, '\n') 

如果每個這就需要轉移到logger電話,你會得到他們每個人的條目。

爲了解決這個問題,你可以實現一種緩衝,它只爲整行和關閉調用logger.log()

0

我能想到的是,由於您覆蓋了sys.stdout,寫入日誌行的實際命令將附加一個換行符:sys.stdout.write("log text\n")。日誌記錄模塊/方法會自行附加一個換行符,所以你會得到兩條換行符。

但是,這應該只顯示一個完全空白的行,而不是隻有<date> <name> <level>的空行。這可能是由其他地方的單個sys.stdout.write("\n")陳述造成的。

我能想到的最簡單的方法是從msg中去掉換行符,並檢查消息是否爲空。不是最漂亮的,但如果可行,換行符可能是原因,你可以從那裏開始工作:

def write(self, msg, level=logging.INFO): 
    msg = msg.rstrip("\n") 
    if msg: 
     self.logger.log(level, msg) 
+0

如果僅僅是這樣,你會是對的。但是,可惜的是,'print'對每個組件進行拆分調用,並對''''和''\ n''進行拆分。 – glglgl 2012-08-09 08:52:08

+2

這似乎很奇怪,正在使用的應用程序,首先不使用Python日誌記錄。在這種情況下使用打印語句並不合適。 – Evert 2012-08-09 09:06:15

+1

這可能發生在有機增長的應用程序中...... – glglgl 2012-08-09 10:02:09