为扭曲的记录器注册多个观察者

问题描述 投票:4回答:1

我编写了一个自定义的tcp观察器,该观察器可以通过网络发送消息以由logstash进行解析。

在我的应用程序中,我想记录如下内容:

  1. “ acme”名称空间[info]转到一台logstash服务器
  2. “ acme”名称空间[调试,严重,警告]移至另一个
  3. “”名称空间[信息,调试](扭曲的日志)进入信息文件
  4. “”名称空间[警告,严重](扭曲的错误)进入错误文件

是否可以使用一个记录器来实现?还是应该注册多个记录器?

问题似乎是可以在两个地方注册观察员:

  • [twisted.Logger.globalLogBeginner但这为所有记录器注册了obs]
  • logger.Logger(observer=)但这只能注册一个观察者

我可以用一个记录器完成我想做的事情,还是应该注册多个记录器?对于点[[1和2,我将有两个记录器,一个“客户”和一个“调试”,但如果可能的话,我宁愿避免使用34debug一个不同的记录器。

这里是我实际尝试过的:

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()

python logging twisted
1个回答
0
投票
您可以通过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')

© www.soinside.com 2019 - 2024. All rights reserved.