芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

メモ:ファイル出力するlogging

15時間でわかるPython集中講座

15時間でわかるPython集中講座

以上の本の8-2でloggingについて書かれており, また,ファイルへの出力の仕方も書かれています. まぁ,しかし,やり方は以下のサイトのスクリプト例とほぼほぼ同じです. qiita.com a-zumi.net

しかし,私のPython環境では,どうもlogファイルは作成されても, そこにメッセージを書き込まれていかない. 原因が分かりません.

そこで以下のサイトを見ると,別の書き方が記載されており, それを真似るとファイル出力されました! docs.python.org ポイントはスクリプトの最初でlogging.basicConfigを実行, その際に引数filenameを指定し,そこにファイルパスの文字列を渡すという事です. 一行で済んでしまいました!

たしか,

で良かったと思うのですが, この本の並列クローリングする章でlogging.basicConfigを用いて, そこで初めて私はloggingを使い始めたのですが, ここで書かれているlogging.basicConfigに引数filenameを追加で指定すれば ログをファイルとして保存できるという...

さらに,以上にlogging.captureWarningsを追加実行すると 警告もログとしてファイル出力されます.
参考:logging --- Python 用ロギング機能 — Python 3.9.1 ドキュメント

import logging
logging.basicConfig(filename='example.log',
                    level=logging.DEBUG,
                    format='[%(process)d:%(asctime)s] %(message)s'
                    )
logging.captureWarnings(True)

logging.info("www")

import numpy as np
a=np.array([1,2])
b=np.array([[1,2,3],[5,6,7]])
a==b

上記実行するとログファイルが作成されますが, どうやら警告部分はShift-JISになってしまっているみたいなんですよね... logging.captureWarningsにはopenと同様に encodingといった引数が用意されているみたいなのですが,指定してみるとValueError: Unrecognised argument(s): encodingとエラーが... 書き方が悪いのか... ちょっと分かりません... なので,なのか,警告のパス部分が文字化けを起こしますね.

logging.captureWarningsfilemodeはデフォルト(指定しない)では'a'なので前回起動したときのログを残したまま 追加でログが記録されます. 'w'を指定すると前回のログが全て消され今回のログが上書きされます.