2016-06-25 16 views
-1

私は次のコードでのカスタムロガーを作成しています:LogstashハンドラがTypeErrorを投げているのはなぜですか?

import logging 
import logstash 

from socket import gethostname 

class CustomLogger(logging.Logger): 
    def _log(self, level, msg, args, exc_info=None, extra=None): 
     if extra is None: 
      extra = { 'hostname' : gethostname() } 
     super(CustomLogger, self)._log(level, msg, args, exc_info, extra) 

def setup_custom_logger(host, port): 
    # add hostname to the formatter. 
    logging.setLoggerClass(CustomLogger) 

    formatter = logging.Formatter(fmt='%(hostname)s - %(asctime)s - %(levelname)s - %(module)s - %(message)s') 

    logstash_handler = logstash.LogstashHandler(host, port, version=2) 
    logstash_handler.setLevel(logging.DEBUG) 
    logstash_handler.setFormatter(formatter) 

    logger = logging.getLogger(__name__) 
    logger.setLevel(logging.DEBUG) 
    logger.addHandler(logstash_handler) 

    return logger 

が、私はsetup_custom_loggerから返されたロガーを使用するとき、私はいつもTypeErrorを取得します。

私はlogger.info('hello')とし、logger.info(b'hello')でそれを呼び出してみましたが、両方のインスタンスになった:

--- Logging error --- 
Traceback (most recent call last): 
    File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/logging/handlers.py", line 620, in emit 
    self.send(s) 
    File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/logging/handlers.py", line 678, in send 
    self.sock.sendto(s, self.address) 
TypeError: a bytes-like object is required, not 'str' 

それは'hello'は、確かに、strタイプですので'hello'をログに記録することは動作しないだろうと、いくつかの意味があります。

しかし、b'hello'は、バイトのようなオブジェクトです:

>>> type(b'hello') 
<class 'bytes'> 

は、なぜ私はこのエラーを受け取るのですか?私はpython-logstash 0.4.6とPython 3.5.1を使用しています。

答えて

0

問題はフォーマッタの問題です。私はlogstash_handlerオブジェクトにフォーマッタを追加する行を削除し、設定に従ってlogstashに正常に記録しました。

関連する問題