2013-02-28 101 views
2

目前我有一切記錄到一個日誌文件,但我想分開它出來多個日誌文件。我看着python文檔中的日誌記錄,但他們不討論這個。Python:登錄到多個日誌文件

log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" 
logging.basicConfig(filename=(os.path.join(OUT_DIR, + '-user.log')), 
      format=log_format, level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S') 

目前這是我如何做記錄。我想要做的事情有不同類型的錯誤或信息登錄到不同的日誌文件。在我做的時候logging.info('Logging IN')logging.error('unable to login')會去相同的日誌文件。我想分開他們。我是否需要創建另一個日誌記錄對象來支持將日誌記錄到另一個文件中?

+0

你想達到什麼目的?您是否嚴格要求原始日誌文件的副本,或者您是否嘗試按日誌級別進行分隔,或者?.. – 2013-02-28 23:34:26

+0

請參閱'logger.addHandler'示例,網址爲http://docs.python.org/2/howto/ logging-cookbook.html – 2013-02-28 23:35:34

+0

只是添加更多信息的問題 – 2013-02-28 23:38:39

回答

2

你/會/做些什麼(我沒挖成logging模塊太多所以有可能是一個更好的方式來做到這一點),也許是使用流而不是一個文件對象:

In [1]: class LogHandler(object): 
    ...:  def write(self, msg): 
    ...:   print 'a :%s' % msg 
    ...:   print 'b :%s' % msg 
    ...:   

In [3]: import logging 
In [4]: logging.basicConfig(stream=LogHandler()) 
In [5]: logging.critical('foo') 
a :CRITICAL:root:foo 
b :CRITICAL:root:foo 

In [6]: logging.warn('bar') 
a :WARNING:root:bar 
b :WARNING:root:bar 

編輯用在進一步處理

已經假設你的日誌文件存在,你可以做這樣的事情:

import logging 

class LogHandler(object): 
    format = '%(levelname)s %(message)s' 
    files = { 
     'ERROR': 'error.log', 
     'CRITICAL': 'error.log', 
     'WARN': 'warn.log', 
    } 
    def write(self, msg): 
     type_ = msg[:msg.index(' ')] 
     with open(self.files.get(type_, 'log.log'), 'r+') as f: 
      f.write(msg) 

logging.basicConfig(format=LogHandler.format, stream=LogHandler()) 
logging.critical('foo') 

這將允許您根據日誌消息中的條件將日誌記錄分割爲各種文件。如果沒有找到您要查找的內容,它只是默認爲log.log

1

我創造了這個解決方案從docs.python.org/2/howto/logging-cookbook.html

只需創建兩個記錄文件處理程序,轉讓其日誌級別,並將它們添加到您的記錄。

import os 
import logging 

current_path = os.path.dirname(os.path.realpath(__file__)) 

logger = logging.getLogger('simple_example') 
logger.setLevel(logging.DEBUG) 

#to log debug messages        
debug_log = logging.FileHandler(os.path.join(current_path, 'debug.log')) 
debug_log.setLevel(logging.DEBUG) 

#to log errors 
errror_log = logging.FileHandler(os.path.join(current_path, 'error.log')) 
errror_log.setLevel(logging.ERROR) 

logger.addHandler(debug_log) 
logger.addHandler(errror_log) 

logger.debug('This message should go in the debug log') 
logger.info('and so should this message') 
logger.warning('and this message') 
logger.error('This message should go in both the debug log and the error log')