4

Twisted 中是否有任何方法可以更改应该记录的消息的日志记录级别?

我在项目中使用三个级别:

log.msg('agent nr.1 has free slots', logging.DEBUG) # debug message
log.msg('agent nr.1 has free slots') # info message
log.err('agent nr.1 has free slots') # error message

我以这种方式配置日志记录:

from twisted.python import log
from twisted.python.logfile import LogFile

logfile = LogFile("someFile.log", '/some/path/', rotateLength=1000, maxRotatedFiles=100)
application.setComponent(log.ILogObserver, log.FileLogObserver(logfile).emit)

但我需要设置应该记录哪些消息(例如,只有信息和错误消息,没有调试)。怎么做?

4

2 回答 2

11

首先,您使用的 api 不存在。它没有在模块级别记录,但log.msg此处记录:传递给的所有非关键字参数log.msg都是消息的一部分,因此在这里您不是设置消息级别而是在消息中添加一个整数,顺便说一句,不鼓励这种形式。

log.msg('agent nr.1 has free slots', logging.DEBUG) # debug message

其次,要回答您的问题,是的,您可以指示twisted 使用日志级别来确定应记录哪些消息,但这不是默认记录器的工作方式。幸运的是,个性化扭曲有点自然(如果你知道怎么做的话)。

你必须编写一个记录器观察者,例如你可以扩展 twisted.python.log.FileLogObserver,它处理一个 logLevel:

import logging
from twisted.python import log

class LevelFileLogObserver(log.FileLogObserver):

    def __init__(self, f, level=logging.INFO):
        log.FileLogObserver.__init__(self, f)
        self.logLevel = level

    def emit(self, eventDict):
        if eventDict['isError']:
            level = logging.ERROR
        elif 'level' in eventDict:
            level = eventDict['level']
        else:
            level = logging.INFO
        if level >= self.logLevel:
            log.FileLogObserver.emit(self, eventDict)

那么你必须注册它

from twisted.python import logfile

f = logfile.LogFile("someFile.log", '/some/path/', rotateLength=1000,
                    maxRotatedFiles=100)
logger = LevelFileLogObserver(f, logging.DEBUG)
twisted.python.log.addObserver(logger.emit)

如果你使用twistd,你可以通过--logger选项传递它:

# mylogger.py
# import LevelFileLogObserver
from twisted.python import logfile

f = logfile.LogFile("someFile.log", '/some/path/', rotateLength=1000,
                    maxRotatedFiles=100)
flobserver = LevelFileLogObserver(f)
observer = flobserver.emit

# twistd invocation
twistd --logger=mylogger.observer

现在您可以使用您定义的新 api:

log.msg('the level of this message is INFO')
log.msg('the level of this message is INFO', level=logging.INFO)
log.msg('the level of this message is DEBUG', level=logging.DEBUG)
log.msg('the level of this message is ERROR', level=logging.ERROR)
log.err('the level of this message is ERROR')
于 2012-12-10T15:13:39.407 回答
0

我研究了来自mg.其他来源的答案,并实现了一个小型库tx-logging。您将能够以常见的 Python 方式编写日志:

LOG = tx_logging.getLogger("some log name")
LOG.debug("some message")

访问主页获取信息:https ://github.com/oblalex/tx-logging 。希望这对将来的人有所帮助。

于 2014-03-19T09:44:52.177 回答