非効率も効率

筆者のパソコン関連や効率化についての考察と雑談

ログ出し

2022/10/06 追記開始
formatの設定で行番号もモジュール名も自動で出力出来ちゃうじゃあないですか。
2022/10/06 追記終了


どんな言語、プログラムでもログ出しは基本だと思います。

python勉強しだしてから、簡単に使えるログ出し関数が欲しくなったので、情報収集しました。

実装だけなら、テキストファイルに出力するだけでいいのですが、どうせならpythonっぽくということで、loggingとか色々使ってみました。

結果、ログ出し関数を呼んだファイル名とか、行番号まで出力できるというものが完成。

VBAでは自作関数に呼び出し元モジュール名とか関数名を渡していましたよ・・・行番号なんて手間かかりすぎて無理。

loggingではDEBUGとかINFOとかのレベルや、出力フォーマット整えたりもできるみたいですが、とりあえずはこれで十分。

区切りがTab文字なのは、テキストエディタから、そのままExcelに張り付ける事ができて、分析がやりやすいからです。

import logging
import datetime
import inspect
import os

def kanilog(msg):
    #ルートには出力しない
    logger = logging.getLogger('kanilog')
    logger.setLevel(logging.DEBUG)

    #ファイル名に日付を入れる
    LOG_FILENAME = 'kanilog_' + datetime.datetime.today().strftime('%Y%m%d') + '.log' 
    handler = logging.FileHandler(filename=LOG_FILENAME)
    handler.setLevel(logging.DEBUG)
    logger.addHandler(handler)

    #出力日時
    logmsg = datetime.datetime.today().strftime("%Y/%m/%d %H:%M:%S") 
    #ファイル名(フルパスからファイル名のみに変更)
    logmsg = logmsg + '\t' + os.path.basename(inspect.currentframe().f_back.f_code.co_filename)
    #行番号
    logmsg = logmsg + '\t' + str(inspect.currentframe().f_back.f_lineno) 
    #メッセージ
    logmsg = logmsg + '\t' + msg
    #出力
    print(logmsg)
    logger.debug(logmsg)

#出力テスト
kanilog('test')


出力結果

参考サイト
http://pheromone.hatenablog.com/entry/20100817/1282055593
https://qiita.com/ymko/items/b46d32b98f013f06d805
http://docs.python.jp/2.6/library/logging.html
https://python.civic-apps.com/logifle-logger/

それにしても、はてなブログソースコード表示用の機能便利ですね。