Python: 現在時刻をファイル名に付けたログファイルを作成する方法

2018年12月19日

ログファイルとは

プログラムを実行したときに、処理の経過に関する情報をファイルに残したいときがある。

例えば、プログラムが思ったように動かない場合、デバッグのために以下のような情報を記録する。

  • 処理ステップの経過
    • 処理がどのような順番でどこまで進んだか
  • 計算の経過
    • 入力データがどのような値で、途中の計算でどのような値の計算が行われているか
    • 条件分岐でどのような判定が行われたか
  • 時刻や実行時間の情報
    • 処理にどれぐらいの時間がかかったか

こういった記録ファイルのことを”ログファイル”や”ログ”という。

ログ(log)という単語には、ログハウスでおなじみの”丸太”という意味があるが、”航海日誌”という意味もある。どちらかと言えば、コンピュータの世界ではこの”航海日誌”と同様の”記録”という意味で使われることが多い。

pythonにはloggingというモジュールがあり、用途別に情報をファイルに出すことができるのを最近しった。ここでは、私が我流でやってた処理について書く。loggingについて詳細を理解したら別に紹介する。

ログファイルの作成の流れ(loggingを使わない我流)

ログファイルを残す方法は、以下のように記録したい情報を人間が読める文字列として出力することである。

  1. スクリプト(処理)の冒頭で、Pythonでログファイルを作成するには、テキストファイルをオープンする
  2. 残したい情報を文字列としてログファイルに出力する
  3. プログラムを終了する際、ログファイルをクローズする

以下に、実行開始日時をファイル名としたログを作成するPythonスクリプトの例を示す。

import sys, time

"""--------------------------------------
open logfile
--------------------------------------"""
fname_log = time.strftime("%Y%m%d_%H%M%S.log", time.localtime())
log_f = open(fname_log, 'w')

def outstr(str):
log_f.write(str + '\n')
print(str)

def logstr(str):
log_f.write(str + '\n')

"""--------------------------------------
main process
--------------------------------------"""
outstr('Hello world')
logstr('Hello Log world')

"""--------------------------------------
close logfile
--------------------------------------"""
log_f.close()

sys.exit(0)

6行目: ファイル名を変数fname_logに代入
7行目: ファイルを書き込みモード(w)でオープン
9~13行目: 2つの関数、outstr()とlogstr()を定義
19行目: outstr()でメッセージ出力
20行目: logstr()でメッセージ出力
25行目: ログファイルをクローズ
27行目: 終了ステータスとして0を返してスクリプト実行を終了

outstr()とlogstr()とprint()の使い分け

outstr()は、引数の文字列strを画面に表示するのと同時にログファイルにも出力する
logstr()は、引数の文字列strをログファイルに出力するのみ(実行時の画面には表示されない)

これらの関数の使い分けは特に決まっておらず、私はなんとなく

  • outstr(): スクリプト実行時にできるだけ早く知りたい重要な情報を出力
  • logstr(): 後で見るかもしれない参考情報を出力
  • Pythonのprint(): ログファイルに残す必要がないメッセージ等

と使い分けている。

この使い分けは好みの問題だが、print()やoutstr()で実行時に画面にたくさんの情報を表示すると、それだけでスクリプトの実行速度が遅くなることあるので、必要に応じて使い分ければよい。