使用fileConfig在Python中配置自定义处理程序

时间:2015-01-20 20:48:42

标签: python python-3.x logging

我使用配置文件在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:没有名为' TimeRotatingFileHandler'

的模块

我做错了什么?我也尝试将类行改为class=handlers.TimeRotatingFileHandler但在这种情况下我得到了下一个错误:

  

ImportError:没有名为' handlers'

的模块

3 个答案:

答案 0 :(得分:4)

我在使用dictConfig时遇到了同样的问题我的解决方案是完全限定模块路径,如下所示:

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

您可能想尝试一下

答案 1 :(得分:2)

class=logging模块的命名空间中进行评估,默认情况下,它与handlers没有绑定。所以你可以做到

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

在致电fileConfig()之前,然后class=handlers.TimedRotatingHandler应该有效。

答案 2 :(得分:2)

如果你决定创建一个自定义处理程序,你需要做的就是在代码顶部附近定义该处理程序,然后将其定义为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