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

z0qdvdin  于 2023-04-13  发布在  Python
关注(0)|答案(3)|浏览(102)

我使用一个配置文件在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”的模块

zmeyuzjn

zmeyuzjn1#

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

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

你也许想给予

vuktfyat

vuktfyat2#

class=是在logging模块的名称空间中计算的,默认情况下它没有到handlers的绑定。

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

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

6qqygrtg

6qqygrtg3#

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

相关问题