我编写了一个自定义的tcp观察器,该观察器可以通过网络发送消息以由logstash进行解析。
在我的应用程序中,我想记录如下内容:
是否可以使用一个记录器来实现?还是应该注册多个记录器?
问题似乎是可以在两个地方注册观察员:
twisted.Logger.globalLogBeginner
但这为所有记录器注册了obs]logger.Logger(observer=)
但这只能注册一个观察者我可以用一个记录器完成我想做的事情,还是应该注册多个记录器?对于点[[1和2,我将有两个记录器,一个“客户”和一个“调试”,但如果可能的话,我宁愿避免使用3和4与debug一个不同的记录器。
这里是我实际尝试过的:from twisted import logger
from twisted.internet import reactor
from txlab.logger import LogstashLogObserver
# Global object to control globally namespace logging
logLevelFilterPredicate = logger.LogLevelFilterPredicate(defaultLogLevel=logger.LogLevel.info)
def startLogging(console=True, filepath=None, errpath=None):
"""
Starts the global Twisted logger subsystem with maybe
stdout and/or a file specified in the config file
"""
global logLevelFilterPredicate
observers = []
if console:
observers.append(logger.FilteringLogObserver(observer=logger.textFileLogObserver(sys.stdout),
predicates=[logLevelFilterPredicate]))
if filepath is not None and filepath != "":
observers.append(logger.FilteringLogObserver(observer=logger.textFileLogObserver(open(filepath, 'a')),
predicates=[logLevelFilterPredicate]))
if errpath is not None and errpath != "":
_logLevelFilterPredicate = logger.LogLevelFilterPredicate(defaultLogLevel=logger.LogLevel.error)
observers.append(logger.FilteringLogObserver(observer=logger.textFileLogObserver(open(errpath, 'a')),
predicates=[_logLevelFilterPredicate]))
logger.globalLogBeginner.beginLoggingTo(observers)
def setLogLevel(namespace=None, levelStr='info'):
"""
Set a new log level for a given namespace
LevelStr is: 'critical', 'error', 'warn', 'info', 'debug'
"""
level = logger.LogLevel.levelWithName(levelStr)
logLevelFilterPredicate.setLogLevelForNamespace(namespace=namespace, level=level)
if __name__ == '__main__':
import sys
logInfo = logger.Logger(observer=LogstashLogObserver(b'127.0.0.1', 5001, version=1))
logDebug = logger.Logger(observer=LogstashLogObserver(b'127.0.0.1', 5002, version=1))
startLogging(filepath='/code/txacme/_logs/info.log',
errpath='/code/txacme/_logs/errors.log')
setLogLevel(namespace='', levelStr='debug')
"""
The problem here is that when logging, I cannot use the logDebug to log twisted events,
I need to create another logger without an observer to be able to use the globally registered ones
"""
logTwisted = logger.Logger() # I want to avoid this, using logDebug instead
try:
raise IOError()
except:
log.failure('errrrrr')
log.info("Some values: {values!r}", values=[1234, 5678])
log.info("Some values: {values!r}", values=[9876, 5432])
log.info('{a}, {b}, {c}, that\'s all :)', a=1, b=2, c=3)
reactor.run()
twisted.logger.globalLogPublisher
将多个日志观察器注册到单个日志记录器。 globalLogPublisher
由复合模式设计。也就是说,它本身是一个观察者,并且可以有另一个观察者。除非在构造函数中明确指定观察者,否则记录器将注册globalLogPublisher
。您可以执行类似的操作import sys
from twisted.logger import globalLogPublisher, textFileLogObserver, Logger
from txlab.logger import LogstashLogObserver
log = Logger()
globalLogPublisher.addObserver(LogstashLogObserver(b'127.0.0.1', 5001, version=1))
globalLogPublisher.addObserver(LogstashLogObserver(b'127.0.0.1', 5002, version=1))
globalLogPublisher.addObserver(textFileLogObserver(sys.stdout))
# this will publish logging event to all observers registered in globalLobPublisher.
log.info('some message')