Python 为twisted logger注册多个观察者
我已经编写了一个定制的tcp观察器,它通过网络发送消息,由logstash解析 在我的应用程序中,我希望记录如下内容:Python 为twisted logger注册多个观察者,python,logging,twisted,Python,Logging,Twisted,我已经编写了一个定制的tcp观察器,它通过网络发送消息,由logstash解析 在我的应用程序中,我希望记录如下内容: “acme”名称空间[info]转到一个日志存储服务器 “acme”命名空间[调试、严重、警告]转到另一个 “”命名空间[信息,调试](扭曲日志)转到信息文件 “”命名空间[警告,严重](扭曲错误)转到错误文件 是否可以通过一个记录器实现这一点?或者我应该注册多个记录器 问题似乎是观察员可以在两个地方注册: twisted.Logger.globalLogicr但这会为所有记
但这会为所有记录器注册obstwisted.Logger.globalLogicr
但这只能注册一个观察者logger.logger(observer=)
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.globallowpublisher
向单个记录器注册多个日志观察者GlobalLogicPublisher
是按复合模式设计的。也就是说,它本身是一个观察者,并且可以有另一个观察者。除非构造函数中明确指定了观察者,否则记录器将注册globallowpublisher
。你可以这样做
导入系统
从twisted.logger导入globalLogPublisher、textFileLogObserver、logger
从txlab.logger导入LogstashLogObserver
log=Logger()
globalLogPublisher.addObserver(LogStathLogoBServer(b'127.0.0.1',5001,版本=1))
globalLogPublisher.addObserver(LogStathLogoBServer(b'127.0.0.1',5002,版本=1))
GlobalLogicPublisher.addObserver(textFileLogObserver(sys.stdout))
#这将向在GlobalobPublisher中注册的所有观察者发布日志记录事件。
log.info('some message')