Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为twisted logger注册多个观察者_Python_Logging_Twisted - Fatal编程技术网

Python 为twisted logger注册多个观察者

Python 为twisted logger注册多个观察者,python,logging,twisted,Python,Logging,Twisted,我已经编写了一个定制的tcp观察器,它通过网络发送消息,由logstash解析 在我的应用程序中,我希望记录如下内容: “acme”名称空间[info]转到一个日志存储服务器 “acme”命名空间[调试、严重、警告]转到另一个 “”命名空间[信息,调试](扭曲日志)转到信息文件 “”命名空间[警告,严重](扭曲错误)转到错误文件 是否可以通过一个记录器实现这一点?或者我应该注册多个记录器 问题似乎是观察员可以在两个地方注册: twisted.Logger.globalLogicr但这会为所有记

我已经编写了一个定制的tcp观察器,它通过网络发送消息,由logstash解析

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

  • “acme”名称空间[info]转到一个日志存储服务器
  • “acme”命名空间[调试、严重、警告]转到另一个
  • “”命名空间[信息,调试](扭曲日志)转到信息文件
  • “”命名空间[警告,严重](扭曲错误)转到错误文件
  • 是否可以通过一个记录器实现这一点?或者我应该注册多个记录器

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

    • twisted.Logger.globalLogicr
      但这会为所有记录器注册obs
    • logger.logger(observer=)
      但这只能注册一个观察者
    我可以用一个记录器实现我想要的功能吗?还是应该注册多个记录器?对于点12我将有两个记录器,一个“客户”和一个“调试”,但如果可能,我宁愿避免34成为不同于调试的记录器

    下面是我实际尝试过的:

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