どこもかしこも
ログの階層構造の説明だの、複数ファイルで出力するときの方法だのなんだのと。
説明が冗長……とは言いませんが、詳しすぎて初心者にはきつかったです。
いや、ログのレベルの概念は理解してますねん。
pythonでのログの書き方を知りたいだけですねん。
そういう気持ちを形にしました。
最低限
1ファイルで完結するpythonのプログラムでログを吐かせたいだけならこれでOK。
import logging
# ログ定義
logger = logging.getLogger(__name__) # %(name)sになる
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 標準出力
streamHandler = logging.StreamHandler()
streamHandler.setFormatter(formatter)
# ファイル出力
fileHandler = logging.FileHandler('./log/hogehoge.log')
fileHandler.setFormatter(formatter)
# ロガーにハンドラーを追加
logger.addHandler(streamHandler)
logger.addHandler(fileHandler)
# ログ出力時
logger.info("info log message.")
logger.debug("debug log message.")
これで標準出力とファイルの両方にログが記録されていく。
出力先ごとにログのレベルを変えたい場合は個別のハンドラにfileHandler.setLevel(logging.INFO)
とかすれば変わる。
asctimeはローカルの時間になるっぽい? です。
cloud9が何故か西アメリカになっていたのでそのせいかな……設定のAWS Settingsを変えたら変わるかと思ったんですが変わりませんで。
設定の再読込が必要なのかなー……と思いつつ、あんまり不便ではないので放置しています。
メール出力
最低限+αでメールについても載せておきます(自分が使いたいので……)
# メール出力
import logging.handlers
emailHandler = logging.handlers.SMTPHandler(
mailhost='smtp.mailtrap.io',
fromaddr='FROMアドレス',
toaddrs=['TOアドレス'],
subject='メールタイトル',
credentials=('user', 'password')
)
emailHandler.setFormatter(formatter)
logger.addHandler(emailHandler)
- 16.8. logging.handlers — ロギングハンドラ — Python 3.6.5 ドキュメント
- Python logging 各種出力ハンドラーの使い方について - Symfoware
参考資料
- pythonのロギングに関するメモ · JoeMPhilips
- 【Python入門】loggingモジュールでログを表示してみよう! | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト
ひとつめが割と求めるものに近いざっくりした内容。
ふたつめがもう少し詳しいので、なんとなく動きを確認したら読んでみると良いかも。
ちゃんみおポイント
ひとつめの方で、若干 ぜんぜん違うじゃん!! となったのでメモ。若干ぜんぜんとは
importが紛らわしい
ベストプラクティス、として紹介されているコードにfrom logging import getLogger,StreamHandler,DEBUG
とか書いてあるのだけれど、結局あとでFormatterとか使うときに修正するので最初からimport logging
でいいのでは……となりました。
コードが違う
formatter = logging.Formatter('%(asctime)s - %(name) - %(Levelname)s - %(message)s') #%()内に入る属性はLogRecordと呼ばれる
# 結果
# 2018-05-30 08:27:48,918 - %(levelname)s - Min:811625.0,Target:807566.875,Current:816000.0
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #%()内に入る属性はLogRecordと呼ばれる
# 結果
# 2018-05-30 08:34:31,068 - __main__ - INFO - Min:812945.0,Target:808880.275,Current:817105.0
「$(name) - 」が読み飛ばされてるっぽいのが謎すぎて焦りました。
追記
ログについていろいろ書かれていて勉強になりました。
import logging
でいいのでは、とか言ってごめんな……