Flask の logger が日本語を正しく表示しないのでハマった
表題の通り。Qiita に書こうと思ったが、もしかしたらしょーもないことなのかもしれないのでブログにします。
今 Flask でちょっとした Web アプリを書いているんだけど、Python 3 になっても Python のマルチバイト文字の扱いにハマってしまった。 デバッグでログを吐いている部分で、日本語が正しくファイルに出力されていないことに気づいた。
... # 正しく表示される current_app.logger.info("This is not a Japanese message.") # 何も表示されない! current_app.logger.info("これは日本語です") ...
Flask の logger は要は Python 標準のlogging
ライブラリを使うので、logging
のドキュメントを見てみる→16.8. logging.handlers — Logging handlers — Python 3.6.4 documentation
FileHandler
は、ファイルを開くときにエンコードを指定するようになっていることが分かる。単にビルトイン関数のopen()
を呼ぶ。open()
のドキュメントを読むと、
encoding is the name of the encoding used to decode or encode the file. This should only be used in text mode. The default encoding is platform dependent (whatever locale.getpreferredencoding() returns), but any text encoding supported by Python can be used. See the codecs module for the list of supported encodings.
とある。利用しているサーバで local.getprefferedencoding()
を実行すると・・あれ?UTF-8が帰ってくる。。
しかし、一応FileHandler
のコンストラクタにencoding='utf-8'
を追加すると、、動いた・・なぜ・・。
とりあえず、FileHandler を利用する際はencoding='utf-8'
を指定しようと思います。理由がわかったら追記します(誰かおしえて)