2015-03-02 46 views
1

我有一個python腳本啓動一個類foo的多個實例,然後使用multiprocessing.pool執行該類的方法「運行」 .map像這樣:從python多處理日誌文件,每個線程一個日誌文件,來自導入模塊的日誌消息

import multiprocessing.dummy as mp 
import foo_class 

def run_instance(instance): 
    return instance.run() 

for arguments in list_of_arguments: 
    instances.append(foo_class.Foo(arguments)) 

mp.pool.map(run_instance, instances) 

它工作得很好。給我的麻煩事是,在類中的記錄和文件處理器的構造開始,我希望有一個獨立的日誌文件的類的每個實例:

class Foo(): 
    def __init__(self, name): 
     self.logger = logging.getLogger() 
     self.logfile = logging.FileHandler(name + '.log') 

(我省略了格式化和對數因爲它不是這個問題的一部分。)現在的問題是,用上面描述的方法,我得到每個實例的一個日誌文件,但是所有實例的日誌消息都存在於每個日誌文件中。 如果我的名字記錄器,像這樣:

self.logger = getLogger(name + '_logger') 

則日誌的消息將被分配到正確的文件,但所有進口的模塊,我在其中初始化模塊記錄儀這樣的登錄信息:

module_logger = logging.getLogger(__name__) 

將不再顯示在日誌文件中,因爲模塊記錄器不能識別類實例中與父記錄器不同的命名記錄器(它完全符合上述方法)。

有沒有什麼辦法可以獲得每個實例的日誌文件,這些日誌文件包含來自導入模塊的日誌消息,這些日誌消息也被寫入這些文件?

回答

1
class Foo(): 
    def __init__(self, name): 
     self.logger = logging.getLogger() 

這是不行的,因爲作爲the documentation states,調用getLogger不帶參數只返回根記錄器(這始終是一樣的)。

如果您希望類實例的記錄器是其他人的孩子,您需要明確地做到這一點。所以,如果你的模塊記錄器被命名爲X,你做

self.logger = getLogger(X + "." + name + '_logger')

+0

感謝您的快速回復! 實際上,我想要的是,module_logger是類記錄器的子類,如果我明確給類記錄器命名,那麼這將不起作用,因爲我然後需要將類實例記錄器的名稱傳遞給進口模塊。 – Steffen 2015-03-02 17:00:31

+0

@Steffen我認爲將模塊記錄器作爲類實例中的記錄器的孩子是不合理的 - 也許您誤解了模塊的工作方式?一個模塊獨立於任何這樣的實例以及任何「import」語句而存在。如果你在多個地方導入一個模塊,你會得到同一個對象的引用 – goncalopp 2015-03-02 17:15:21