2013-02-28 102 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')