🦫
structlogのJSONRendererでマルチバイト文字を表示させる
忙しい人用
ensure_ascii=False
を指定すれば良い
structlogってなに?
Pythonの構造化logger。ログをJSONで吐かせることもできる。
困ったこと
公式のexample通りにJSONでログを出力させると、マルチバイト文字はエスケープして表示される。
import structlog
def main():
structlog.configure(processors=[structlog.processors.JSONRenderer()])
log = structlog.getLogger("my-logger")
log.info("こんにちは", hoge="ほげ")
if __name__ == "__main__":
main()
{"hoge": "\u307b\u3052", "event": "\u3053\u3093\u306b\u3061\u306f"}
原因
JSONRenderer
はデフォルトでjson.dumps
を使ってレコードをJSONに変換する。
json.dumps
はデフォルトでensure_ascii=True
が指定されており、ascii文字以外はエスケープされるようになっている。
解決策
JSONRenderer
はdumps_kw
で指定された引数をserializer
に渡してシリアライズ処理を行うので、ensure_ascii=False
を渡してあげればよい。
import structlog
def main():
structlog.configure(
processors=[structlog.processors.JSONRenderer(ensure_ascii=False)]
)
log = structlog.getLogger("my-logger")
log.info("こんにちは", hoge="ほげ")
if __name__ == "__main__":
main()
{"hoge": "ほげ", "event": "こんにちは"}
Discussion