2016-01-22 110 views
1

我寫了很多模塊的大程序。在同一模塊中我希望使用日誌記錄。登錄Python的最佳實踐是什麼? 我應該使用進口非標準日誌模塊,並在每一個我的文件使用它:我應該使用日誌記錄模塊還是日誌記錄類?

#proxy_control.py 
#!/usr/bin/env python3 

import logging 


class ProxyClass(): 

    def check_proxy(): 
     pass 
     logging.basicConfig(filename='proxy.log', level=logging.INFO) 
     logging.info('Proxy work fine') 

也許我應該寫從默認日誌一個MyLog()類繼承和我所有的其他模塊使用它呢?

#proxy_control.py 
#!/usr/bin/env python3 

import MyLog 


class ProxyClass(): 

    def check_proxy(): 
     pass 
     Mylog.send_log('Proxy work fine') 


#my_log.py 
#!/usr/env/bin python3 

import logging 


class MyLog(): 
    def send_log(value): 
     pass 
+1

Python日誌記錄可能會很方便地回答你的問題:https://docs.python.org/2/howto/logging.html –

+0

@KlausD。謝謝,但我閱讀有關日誌記錄的文檔,只發現我應該如何使用默認日誌記錄庫和模塊。我很想知道在程序中構建日誌結構的最佳實踐。什麼經常選擇,爲什麼在實際項目中? –

回答

3

一個典型的約定是在需要日誌記錄的每個模塊的頂部定義一個記錄器,然後在整個模塊中使用該記錄器對象。

logger = logging.getLogger(__name__) 

這種方式,記錄儀會按照你的包名(即package.subpackage.module)。這在記錄模塊中很有用,因爲記錄器根據記錄器名稱向上傳播消息(即,parent.child將傳遞消息至parent)。這意味着您可以在頂級記錄器中完成所有配置,並且它將從包裝中的所有子記錄器獲取消息。或者,如果別人正在使用您的庫,那麼他們將很容易配置他們從庫中獲得的日誌消息,因爲它將具有一致的名稱空間。

對於庫,除非用戶明確啓用它們,否則通常不希望顯示日誌消息。 Python日誌記錄將自動登錄到stderr,除非您設置了處理程序,所以您應該將NullHandler添加到您的頂級記錄器。這將防止郵件自動打印到標準錯誤。

logger = logging.getLogger(__name__) 
logger.addHandler(logging.NullHandler()) 

注意 - 在Python2.7中添加的NullHandler,對於早期版本中,你必須實現它自己。

+0

謝謝你的詳細回覆。但我的主模塊位於遠程服務器和本地PC上的其他模塊上。我應該分裂本地和遠程日誌?或者,我也可以使用遠程服務器來記錄您的答案嗎? –

+2

@DenisSavenko Python的日誌記錄模塊支持超過本地IO(流/文件)處理程序 - 請參閱SocketHandler和SMTPHandler的示例,甚至可以編寫自己的日誌 - 這樣即使使用分佈式架構。事實上,通過適當的配置,您甚至可以同時進行本地日誌記錄以流式處理或文件處理和遠程日誌記錄。 –

1

使用日誌記錄模塊,並將日誌記錄配置保留到應用程序的入口點(模塊不應該自行配置日誌記錄)。