簡體   English   中英

重新定義日志記錄根記錄器

[英]Redefining logging root logger

在我目前的項目中,有數千個代碼行,如下所示:

logging.info("bla-bla-bla")

我不想改變所有這些行,但我會改變日志行為。 我的想法是將根記錄器更改為其他Experimental記錄器,它由ini-file配置:

[loggers]
keys =  Experimental

[formatter_detailed]
format = %(asctime)s:%(name)s:%(levelname)s %(module)s:%(lineno)d:  %(message)s

[handler_logfile]
class = FileHandler
args = ('experimental.log', 'a')
formatter = detailed

[logger_Experimental]
level = DEBUG
qualname = Experimental
handlers = logfile
propagate = 0

現在設置新的根記錄器是由這段代碼完成的:

logging.config.fileConfig(path_to_logger_config)
logging.root = logging.getLogger('Experimental')

重新定義根記錄器是否安全? 也許有更方便的方法?

我試圖使用谷歌並查看stackoverflow問題,但我沒有找到答案。

建議您不要以您描述的方式重新定義根記錄器。 通常,您只應將根記錄器直接用於小腳本 - 對於較大的應用程序,最佳做法是使用

logger = logging.getLogger(__name__)

在每個使用日志記錄的模塊中,然后調用logger.info()等。

如果您只想記錄到文件,為什么不直接向根記錄器添加文件處理程序? 你可以用eg

if __name__ == '__main__':
    logging.basicConfig(filename='experimental.log', filemode='w')
    main() # or whatever your main entry point is called

或通過配置文件。

更新:當我說“你被告知”時,我的意思是我,在這個答案中;-)雖然你可能沒有在你的場景中遇到任何問題,但是覆蓋一個尚未出現的模塊屬性並不是一個好習慣。旨在被覆蓋。 例如,根記錄器是不同類的實例(不是公共API的一部分),並且在日志記錄機器中還有其他對它的引用,它仍將指向舊值。 這些事實中的任何一個都可能導致難以調試的問題。 由於日志包允許多種方式來實現您想要的內容(貌似,記錄到文件而不是控制台),因此您應該使用已提供的那些機制。

logger = logging.getLogger()保留名稱為空將返回根記錄器。

logger = logging.getLogger('name')給你另一個記錄器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM