hokkun blog

技術の話をメインに、たまに糖質制限の話とか色々したい予定。

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'を指定しようと思います。理由がわかったら追記します(誰かおしえて)