22
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Windows10 + python3 + logger でログファイルの出力にUTF-8を使うよう指定する

Last updated at Posted at 2017-09-26

python3 の初心者がてこずったので、メモしておく。
 (2017.09.26記 2018.11.10書き直し)

対象読者

Windows10にもpython3にも慣れていないが、pythonでloggingモジュールを使いたいぐらいにはpython経験のある人

環境

OS:Windows10
Python処理系: Anaconda4でインストールしたpython3.6.0

おこなったこと

loggingモジュールのFileHandlerオブジェクトに文字コードを指定する。

やりかたは2つある

  1. 実行するスクリプト内に直接記述する
  2. loggingモジュールの設定ファイル内に記述する
  • 1の例

  FileHandler オブジェクトをつくるときの引数に encoding='utf-8' と指定する

from logging import getLogger, FileHandler, Formatter, INFO, WARN

logger = getLogger("logger")

handler = FileHandler(filename="test.log", encoding='utf-8')
handler.setLevel(WARN)
handler.setFormatter(Formatter("%(asctime)s %(levelname)8s %(message)s"))

logger.addHandler(handler)

#出力処理
logger.debug("debug あいうえお")
  • 2の例

loggingモジュールの設定ファイルをsample_logging.conf とする。そのなかのfileHandlerの設定を次のようにする

sample_logging.conf
[handler_fileHandler]
class=FileHandler
formatter=simpleFormatter
args=('%(logfilename)s', 'w', 'utf-8')

args= で始まる行が、1の例のFileHandler オブジェクトをつくるときの引数に相当する
この設定ファイルを使うスクリプトは以下のようになるはず。(logging.configを使い設定ファイルを読んでいる)

import logging
import logging.config


if __name__ == '__main__':
    logging.config.fileConfig("sample_logging.conf", \
        defaults={'logfilename': 'logs/sample.log' })

(蛇足)このメモを書いた理由

Windows でPython3を使うときの常識として
「テキストファイルを作成するとそのファイルの文字コードはWindowsの文字コード(cp932)となるのがデフォルト」
がある。

何も考えずに python3 on windows で次のようなスクリプトを実行すると

# -*- coding: utf-8 -*-# python3 でテキストファイルを出力するテスト

s = 'あいうえお'

with open('tmp.txt', 'w') as f:
    f.write(s)

作成されたテキストファイル tmp.txt の文字コードはcp932 となる。
Windowsに慣れていない人はこれをSublimeTextなどで開くと文字化けするので驚く。
(慣れていない人はWindowsのメモ帳は自動判別するので文字化けしないが、SublimeTextなどは自動判別なんてしない、とかいう基本的なことを知らなかったりする)

pythonスクリプトで出力ファイルの文字コードをUTF-8にしたいときは明示的に指定する必要がある。

例えば以下のようにする。


# -*- coding: utf-8 -*-
# python3 でテキストファイルを出力するテスト
import codecs

s = 'あいうえお'

with codecs.open('tmp8.txt', 'w', 'utf-8') as f8:
    f8.write(s)

(私は以上のことを知らなかったのでいきなり自作pythonスクリプトのログファイルが文字化けするのを見て???となったのだった。
ネットを検索して初めて知り、なるほど、ではログファイルの出力でも同様の指定をすればよいのだろう、どこでどう指定すればよいのか?となった。
すぐにはピタッとした例がヒットせず、あちこちさまよった末にやりかたがわかったので、ここに結果だけシンプルにメモしておこうと思った次第。)

22
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?