2015-01-20 31 views
3

我正在使用配置文件在Python应用程序中配置我的记录程序。这是该文件:使用fileConfig在Python中配置自定义处理程序

[loggers] 
keys=root 

[logger_root] 
level=INFO 
handlers=console 

[handlers] 
keys=console,file_rotating 

[handler_console] 
class=StreamHandler 
level=WARNING 
formatter=console 
args=(sys.stderr,) 

[handler_file_rotating] 
class=TimeRotatingFileHandler 
level=DEBUG 
formatter=file 
args=('../logs/twicker.log', 'd', 1, 5) 

[formatters] 
keys=console,file 

[formatter_console] 
format=%(levelname)s - %(message)s 

[formatter_file] 
format=%(asctime)s - %(levelname)s - %(module)s - %(message)s 

我的问题是与TimeRotatingFileHandler。每当我运行应用程序,我得到下一个错误:

ImportError: No module named 'TimeRotatingFileHandler'

我在做什么错了?我也试过改变类线class=handlers.TimeRotatingFileHandler但在这种情况下,我得到了一个错误:

ImportError: No module named 'handlers'

回答

1

class=logging模块的命名空间进行评估,并在默认情况下,这并不有一个结合handlers。所以,你可以做

import logging, logging.handlers 
logging.handlers = logging.handlers 

调用fileConfig()前,然后class=handlers.TimedRotatingHandler应该工作。

3

我遇到了同样的问题,使用dictConfig时,对我来说,解决方案是完全符合这样的模块路径:

[handler_file_rotating] 
class=logging.handlers.TimeRotatingFileHandler 
level=DEBUG 
formatter=file 
args=('../logs/twicker.log', 'd', 1, 5) 

你可能想给一个尝试

0

要在此扩展如果您决定创建自定义处理程序,您需要做的只是在代码顶部定义该处理程序,然后将其定义为logging.handlers中的对象。

例子:

class MyCustomRotatingClass(logging.handlers.RotatingFileHandler): 
    """custom handler that queues messages 
     to be uploaded in batches to the portal 
     in a background thread 
    """ 
    def __init__(self, basedir, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0): 
     logging.handlers.RotatingFileHandler.__init__(self, 'TestSavvyExecute.log','a',250000,40,'utf-8',0) 
     self.maxBytes = maxBytes 

    def emit(self, record): 
     try: 
      if logging.handlers.RotatingFileHandler.shouldRollover(self, record): 
       logging.handlers.RotatingFileHandler.doRollover(self) 

      #ASCII characters use 1 byte each 
      if len(record.msg) > self.maxBytes: 
       oldMsg = record.msg 

       record.msg = record.msg[0:self.maxBytes] 
       logging.FileHandler.emit(self, record) 

       record.msg = oldMsg[self.maxBytes + 1:] 
       self.emit(record) 
      else: 
       logging.FileHandler.emit(self, record) 
     except (KeyboardInterrupt, SystemExit): 
      raise 
     except: 
      logging.handlers.RotatingFileHandler.handleError(self, record)   

logging.handlers.MyCustomRotatingClass = MyCustomRotatingClass 
logging.config.fileConfig('translator.log.config') 

现在您可以轻松地引用它在你的配置文件。

[handler_rollinglog] 
class=handlers.MyCustomRotatingClass