我使用配置文件在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'
的模块
答案 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