调用thrift出现No handlers could be found for logger "thrift.transport.TSocket"

1.问题

使用thrift版本为0.10,在0.8没有这个问题

其中ncTAgent是代码中封装的thrift接口的结构,在thrift服务端没有启动的时候,应该拋错为连接不到。但是拋错的堆栈输出之前,还有一句日志异常错误。这是不期望出现的

>>> from thrift.transport.TSocket import TSocket
>>> from thrift.transport.TTransport import TBufferedTransport
>>> from thrift.protocol.TBinaryProtocol import TBinaryProtocol
>>> from Agent import ncTAgent
>>> socket = TSocket(‘127.0.0.1‘, 9202)
>>> transport = TBufferedTransport(socket)
>>> protocol = TBinaryProtocol(transport)
>>> client = ncTAgent.Client(protocol)
>>> conn = transport.open()
No handlers could be found for logger "thrift.transport.TSocket"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/site-packages/thrift/transport/TTransport.py", line 152, in open
    return self.__trans.open()
  File "/usr/lib64/python2.7/site-packages/thrift/transport/TSocket.py", line 113, in open
    raise TTransportException(TTransportException.NOT_OPEN, msg)
thrift.transport.TTransport.TTransportException: Could not connect to any of [(‘127.0.0.1‘, 9999)]

2.原因

拋错信息有thrift.transport.TSocket,所以查看源码中对应位置,有以下代码

import logging
...

logger = logging.getLogger(__name__)

class TSocketBase(TTransportBase):
    def _resolveAddr(self):
        ...
    def close(self):
        ...
class TSocket(TSocketBase):
    """Socket implementation of TTransport base."""
        ...
    def open(self):
        if self.handle:
            raise TTransportException(TTransportException.ALREADY_OPEN)
        try:
            addrs = self._resolveAddr()
        except socket.gaierror:
            msg = ‘failed to resolve sockaddr for ‘ + str(self._address)
            logger.exception(msg)
            raise TTransportException(TTransportException.NOT_OPEN, msg)

在上述代码中,倒数第二行中使用logger输出了一个异常信息。定位到问题在此处

继续验证logger,使用thrift源码中打印日志的方式,直接打印一个异常信息字符串

>>> import logging
>>> logger = logging.getLogger(__name__)
>>> logger.exception(‘test‘)
No handlers could be found for logger "__main__"

可以看到直接使用logger会出现没有handler错误,其中__main__是logging绑定的模块

所以问题原因为thrift中打印日志没有绑定handler

3.解决

python官方logging.handler文档https://docs.python.org/2/library/logging.handlers.html#module-logging.handlers

python中使用logging打印日志需要绑定handler用于向不同的输出端打log。在thrifit中没有绑定handler故出现了No handler问题。

从源码中解决这个问题,需要在初始化logging之后绑定一个handler

...
# 源码中初始化logger
logger = logging.getLogger(__name__)
# 绑定一个空handler
logger.addHandler(logging.NullHandler())
...

原文地址:https://www.cnblogs.com/newguy/p/8412802.html

时间: 2024-10-11 04:25:14

调用thrift出现No handlers could be found for logger "thrift.transport.TSocket"的相关文章

python No handlers could be found for logger错误的解决

在import logging之后,有时程序调试阶段不能正常运行,但只会报 No handlers could be found for logger "module"错误. 查看详细的log信息,需要在之后加入logging.basicConfig() import logging logging.basicConfig() 现在,你可以看到错误并调试你的代码了. python No handlers could be found for logger错误的解决

thrift的使用及遇到的问题

centos 系统安装官方文档:http://thrift.apache.org/docs/install/centos 一.按该文档安装出现了一系列的问题,记录如下: 1.安装thrift时./bootstrap.sh出错,然后安装libevent问题解决 (首先:git gc,清除./configure 和make错误的信息) # wget http://www.monkey.org/~provos/libevent-1.2.tar.gz # tar zxvf libevent-1.2.ta

python的paramiko模块报错解决办法

写了一个Python脚本内容如下: #-*- coding:utf-8 -*- __author__ = 'kai' import paramiko import sys,os host = sys.argv[1] user = 'zk' password = '123' cmd = sys.argv[2] s = paramiko.SSHClient()        #绑定实例 s.load_system_host_keys()       #加载本机HOST主机文件 s.set_missi

python ssh弱口令爆破多线程脚本及遇到的一些错误与问题

练习写了个SSH弱口令爆破多线程脚本,遇到的问题 1.一开始想import pexpect 中的pxssh 然而却一直该有错误, ImportError: cannot import name spawn google了下问题都说的很模糊也不清楚.有的说是pexpect模块没安装好,有的说是python import的问题,因为在lib中已经有了spawn模块,与pexpect模块中的spawn重名了,所以报错.但也都没说清楚该这么弄.最后在here这里看到了问题原因,原来是pexpect根本不

利用thrift在c++、java和python之间相互调用

转自:http://blog.csdn.net/andy_yf/article/details/7487384 thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点:代码侵入较强是其弱点. 下面记录以C++做服务器,C++,java和python做客户端的示例,这个和本人现在工作环境吻合,使用多线程长连接的socket来建立高效分布式系统的跨语言调用平台.遗憾的是目前版本(0.7.0)的C语言还不支持Compact协议,导致在现在的环境中nginx c module调用thrift要

thrift 远程服务调用 简单示例

/* * @(#) HelloServiceClient.java 2015年7月22日 * */ package com.le.mms.thrift.client; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transpor

RPC框架Thrift例子-PHP调用C++后端程序

更新 2016-02-22: Response对象不用主动创建. 前言 前段时间用了一下Facebook的开源RPC框架Thrift,做PHP客户端调用C++后端程序,真心觉得Thrift不错! 本文项目地址:https://github.com/zekunyan/ThriftDemo_PHP_CPP 先看看本文的例子示意图: 流程 PHP客户端发起请求,请求参数是“Request”类型,里面有studentID参数. CPP服务端收到请求返回数据,返回类型为“Response”,里面包含了st

两种方式获取Thrift调用的clientIP地址

thrift依赖 <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.9.3</version> </dependency> 方法一: package com.lala.server; import org.apache.thrift.TProcessor; import

Axis实现 web service接口开发 + 客户端调用

看到网上挺多人找webservice axis开发案例,但是网上较多的都是有点乱,初学者不太容易看得懂,所以最近看到自己终于有了点空闲时间,就上传了一份比较简单的webservice axis的完整案例. 只适用于初学者. 一.新建一个web项目 导入lib包. 2.配置 web.xml <!-- axis 配置 -->   <servlet>         <display-name>Apache-Axis Servlet</display-name>