はじめに
学生時代には自分でAPIを利用したプログラムなどを作成していました。
エンジニアあるあるの
「なぜ動かないのか分からない」
「なぜ動いているのか分からない」
に苦しめられた記憶があります。
社会人になり企業で勤めるなかでもっと早く「ログをメモする」という概念に出会いたかったので、どこかのプログラミング学習を始めた人に届けばうれしいです。
ログファイルとは
システムなどで発生した出来事を時系列で記録したデータファイルのことです。
エラー内容のみではなく「問題なく動作している」ということも記載します。
これにより後々問題が発生したときに
「プログラムのここまでは問題なく動作しているな」
「この処理ができなかったんだな」
というエラー場所を見つけることが早くできます。
また個人のプログラムであれば一回の動作でも数分で終わるかもしれませんが、大規模なプログラムになるほど一回の動作が数十分、数時間に及びます。
(サーバー関連などは毎日常に動くことが前提なので、それ以上の時もあるでしょう)
このようなプログラムは修正して動くかどうかを実際に動かして確認する回数を極力抑えたいです。
そのためにもエラー内容などはどこかにメモを残しておきたいものです。
ログファイルの記載方法
今回は私が学習したPythonでのログファイルの記載方法をまとめます。
勝手な想像ですが大体のプログラミング言語はログ関連のライブラリなどがあると思うので、ご自分の言語に合わせて調べてください。
インストール
pip install logging
これによりloggingモジュールをインストールします。
実装
loggingモジュールがインストールできたら下記プログラムでテストをします。
今回はテストするフォルダにlogフォルダを作成しておきました。
project_folder/
├────logger_config.py
└────logs/
import logging
logger = logging.getLogger("my_app")
def main():
logging.basicConfig(filename="./logs/myapp.log", level=logging.INFO)
logging.info("これは情報レベルのログテストです")
if __name__ == "__main__":
main()
結果
実行後にlogsフォルダを開くとmyapp.logファイルが作成されていました。
これを開くと中身が下記のようになっているはずです。
INFO:root:これは情報レベルのログテストです
| 1 | 2 |
|---|---|
| INFO | logging.infoの部分です。warningなどもあります(後述) |
| root | root、プログラムを実行フォルダで取得したlogということになります。 別のファイルでログ取得すると違いが分かりやすい |
| これは(略) | ログのアラート内容です |
また何回か実行してmyapp.logを見直すと前回実行の内容が消されることなく追加で新しいlogが記載されることを確認できます。
つまり、プログラムの随所に「○○実行完了」とでも記載しておけば、プログラムがエラーを吐き出してもエラー箇所が分かりやすいのです。
ターミナルでも分かるんじゃね?
実際のプログラムではエラー時にtry-catchなどを用いて、その処理を再処理したり無視するようにしたりします。
これによってプログラム全体が停止することのないようにします
逆に飛ばされた処理はターミナル上では飛ばされたことが分かりにくく、再処理が無限ループしない限り再処理には気づきません。
そのためにlogファイルを残し、問題が発生した処理を分かりやすくします。
ログレベル
| 1 | 2 |
|---|---|
| CRITICAL | プログラム自体が実行を続けられないことを表す |
| ERROR | ソフトウェアがある機能を実行できないこと |
| WARNING | 想定外の事象、または近い将来に問題が起きる可能性 |
| INFO | 想定された通りのことが起こったことの確認 |
| DEBUG | 原因を突き止めようとする開発者向けの情報(デバッグ) |
| NOTSET | 全てのイベントが処理される |
※使い分けは個人の感想です
基本的にNOTSETはガン無視です。正常動作の確認のために記載するくらいです。
DEBUGは開発中などに「この辺うまく動かないな~、どこまで動いてるんやろ」と確認する用途。
INFOは動作の開始・終了の通知を行うなどに用いられることが多い(多分)
WARNINGはストレージ容量の圧迫など近日中に対応した方が良さげなアラート
ERRORはプログラム全体の中で特定の機能が動作しない場合
CRITICALはプログラムがどこかで停止したなど
個人的にError以上のアラートは即時対応が必要だと思います。 Errorだけはその場所によって放置する人もいるかも?
最後に
プログラムを作成していて無限ループに入ることもあり得ると思います。
その時に単純に実行時間が長いのか、無限ループに入っているのかの判断は難しいです。
logを記載する習慣があると何回目のループ化を記載できるので、計算上発生することのない回数分のループをしているのかあり得る長さなのか知れることはかなり重要です。
最近ようやく個人プログラムにもlogを記載し始めたのですが、修正する作業も早く進めることができているように感じます。
個人的にもっと早くlogファイルを作成すれば良かったと感じているので今回記事にしてみました。