2017-01-19 258 views
0

我有一個python日誌記錄服務器,兩個測試應用程序和一個共享模塊(submod.py)我希望這兩個應用程序都能夠將日誌事件發送到服務器並使服務器決定如何將它們存儲到單獨的日誌文件中。這很容易,直到共享模塊開始記錄,我不知道如何讓服務器識別子模塊發送哪些程序的日誌事件以存儲到正確的日誌文件。Python日誌記錄 - dictConfig - 子模塊的日誌記錄目標

我的日誌服務器是我發現here

的代碼稍加修改的版本我試圖修改它使用類似於以下的字典日誌記錄配置:

test_log.conf

"handlers": { 
      "console": { 
       "class": "logging.StreamHandler", 
       "level": "DEBUG", 
       "formatter": "complex", 
       "stream": "ext://sys.stdout" 
      }, 
      "test_01": { 
       "class": "logging.handlers.RotatingFileHandler", 
       "level": "INFO", 
       "formatter": "complex", 
       "filename": "test_01.log", 
       "mode": "a", 
       "backupCount": 5, 
       "encoding": "utf8" 
      }, 
      "test_02": { 
       "class": "logging.handlers.RotatingFileHandler", 
       "level": "INFO", 
       "formatter": "complex", 
       "filename": "test_02.log", 
       "mode": "a", 
       "backupCount": 5, 
       "encoding": "utf8" 
      }, 
      "file": { 
       "class": "logging.handlers.RotatingFileHandler", 
       "level": "INFO", 
       "formatter": "complex", 
       "filename": "root.log", 
       "mode": "a", 
       "backupCount": 5, 
       "encoding": "utf8" 
      } 
     }, 
     "loggers": { 
      "root": { 
       "level": "INFO", 
       "handlers": ["console", "file"] 
      }, 
      "test_01":{ 
       "level": "INFO", 
       "handlers": ["console", "test_01"] 
      }, 
      "test_02": { 
       "level": "INFO", 
       "handlers": ["console", "test_02"] 
      } 
     } 

test_01.py

main_logger = logging.getLogger('') 
main_logger.setLevel(logging.DEBUG) 

socketHandler = logging.handlers.SocketHandler('localhost', logging.handlers.DEFAULT_TCP_LOGGING_PORT) 

main_logger.addHandler(socketHandler) 

logging.info('Test 01 main program') 

a = submod.SubClass() 

test_02.py

main_logger = logging.getLogger('') 
main_logger.setLevel(logging.DEBUG) 

socketHandler = logging.handlers.SocketHandler('localhost', logging.handlers.DEFAULT_TCP_LOGGING_PORT) 

main_logger.addHandler(socketHandler) 

logging.info('Test 02 main program') 

a = submod.SubClass() 

submod.py

class SubClass(object): 
    def __init__(self): 
     log = logging.getLogger() 
     log.debug('Debug') 
     log.info('Info') 
     log.warn('Warning') 
     log.error('Error') 
     log.critical('Critical') 
     print(__name__) 

我怎麼能有日誌服務器智能地知道從哪裏submod.py日誌消息當兩個test_01和test_02正在調用它。

我對格式化和令人困惑的解釋表示歉意,這個問題對我造成了腦損傷。

被修改: 爲了清晰和重新措辭不好的解釋。

回答

0

只需使用一個配置文件,您可以在其中根據使用它的程序預定義日誌文件的目標。 Python「日誌記錄」模塊完成您需要的所有任務;這裏是一個配置文件的例子:http://www.zetadev.com/software/aspen/trunk/doc/html/logging-conf.html

+0

據我瞭解你引用它的配置並不能解決問題。我試圖建立一個動態配置,可以應用於多個使用相同子模塊的程序,但需要服務器智能地確定子模塊的消息應該保存到每個主程序的日誌文件中。 – Chex

+0

知道了,那麼這個怎麼樣? https://docs.python.org/2/howto/logging-cookbook.html#using-logging-in-multiple-modules – postoronnim

+0

這可以工作,我希望在應用程序之間重新使用模塊,以便靜態分配父項有點痛苦。有沒有一種方法來確定調用的「父」?或者,我應該只傳遞父級的名稱,將其作爲變量並設置它。 – Chex