-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を使用しています。