2017-08-17 66 views
0

目標: 要運行實驗「A」10次,每次輸入不同的數據。實驗A返回一個浮點值作爲其輸出(讓我們稱之爲結果)。 10個實驗的所有10個結果應保存在結果文件中(使用日誌記錄)。在運行實驗A時(每次)需要做很多日誌記錄。 (10)實驗的所有中間輸出應寫入(10)不同的日誌文件。如何使用python for循環中的日誌寫入特定的輸出到多個日誌文件?

換句話說, 如果我的實驗目錄是'exp_dir'。在實驗結束後應該存在一個結果(日誌)文件,用於保存每個實驗的輸出(只有輸出需要保存,沒有其他)。在運行每個實驗的過程中,我將爲exp_dir中的10個實驗中的每一個創建子目錄(exp1,exp2等),並將實驗的結果記錄在相應的子目錄中(實驗1結果應保存在exp1中子目錄)。我打算在使用for循環的單個python文件中執行此操作。

你能讓我知道如何分別進行日誌記錄嗎?這是我想什麼(而不是10個實驗我試了2個實驗)

import logging 
import os 

class MyLogger(object): 
    def __init__(self): 
     self.logger = logging.getLogger() 
     self.logger.setLevel(logging.INFO) 

    def activateLogFile(self, f): 
     d = os.path.dirname(f) 
     os.makedirs(d, exist_ok=True) 
     handler = logging.FileHandler(f) 
     self.logger.addHandler(handler) 

    def doLogging(self, fn, info): 
     self.activateLogFile(fn) 
     self.logger.info("{i}\n".format(i=info)) 


def run(): 

    exp_dir = os.getcwd() 
    myLog.doLogging("{d}/res.log".format(d=exp_dir), "This is where results should be logged") 
    myLog.logger.propagate = False 
    for i in range(1, 3): 
     myLog.doLogging("{d}/exp{i}/info.log".format(i=i, d=exp_dir), "some logging") 
    myLog.doLogging("{d}/res.log".format(d=exp_dir), "Experiments done") 

myLog = MyLogger() 

if __name__ == "__main__": 
    run() 

但一切,是在EXP2記錄也被記錄在EXP1和res.log包括所有的日誌記錄(EXP1,EXP2也)

我感謝你的幫助

+0

爲了說清楚,問題是如何分別記錄每個實驗以及如何將每個實驗的結果保存在結果文件中。 – user1540393

+0

您向我們展示了您想要做的事情,但您並未向我們展示您嘗試過的內容。堆棧溢出不是代碼寫入服務。在發佈問題之前,您需要展示自己的努力。你已經導入了日誌記錄,但是我們沒有看到你試圖用它做任何事情的任何地方。您是否閱讀過文檔?嘗試了一些東西,它沒有工作?編輯你的問題併發布你已經嘗試過的。不要評論你的問題;編輯問題本身並添加您的說明。 – AJNeufeld

+0

對不起。我包含了我的代碼。 – user1540393

回答

1

你的代碼讀取(大約):

self.logger = logging.getLogger() 

handler = logging.FileHandler(f1) 
self.logger.addHandler(handler) 
self.logger.info("Log exp 1 stuff") # Logs to f1 

handler = logging.FileHandler(f2) 
self.logger.addHandler(handler) 
self.logger.info("Log exp 2 stuff") # Logs to f1, f2 

handler = logging.FileHandler(f3) 
self.logger.addHandler(handler) 
self.logger.info("Log global stuff") # Logs to f1, f2, f3 

注意你添加第二個,然後是第三個處理程序到您的日誌對象。你並沒有刪除舊的處理程序。

您可以:

def __init__(self): 
     self.handler = None 
     # ... other code ... 

    def activateLogFile(self, f): 
     # ... other code ... 
     if self.handler is not None: 
      self.logger.removeHandler(self.handler) 
     self.handler = logging.FileHandler(f) 
     self.logger.addHandler(self.handler) 

正如Removing handlers from python建議,也許你可以簡單地使用:

def activateLogFile(self, f): 
     # ... other code ... 
     self.logger.handlers = [] 
     self.logger.addHandler(handler) 
+0

它的工作原理。謝謝 – user1540393

0

什麼用keeping it simple是怎麼回事?

import logging 
from os.path import join, dirname, abspath 

def fast_log(msg, filename='res.log'): 
    logging.basicConfig(filename=filename, level=logging.INFO) 
    logging.info(msg) 

def do_experiment(i): 
    filename = join(dirname(abspath(__file__)), "%d.log" % i) 
    fast_log("experiment initialization log", filename) 
    # do stuff 
    fast_log("first stage", filename) 
    # do a lot 
    # more stuff 
    # ... 
    results = execute_final_stage_of_exp() 
    return results 

for i in range(1, 11): 
    fast_log(do_experiment(i)) 
相關問題