Web アプリケーションをデバッグしたことがある場合は、おそらく自分が認めたい以上にデバッグを行ったことがあるでしょう。エラーがポップアップ表示されます。ログをスクロールします。重要なものが見つかります。その一部をコピーします。次に、それをどこかに貼り付けます。おそらくチームメイトとのチャット、おそらくドキュメント、あるいはますます、内容を理解するのに役立つ AI ツールに使用されます。
私もあなたの立場でしたが、ある時点で、これはやめるべきだと感じました。そこで、私はこの手動ログ処理に対処するソリューションを慎重に作成しました。
ログを解析するための自動化システムの作成
スクリプトに手動ワークフローを処理させる
ログはすでに構造化されたテキストです。小さなスクリプトを使用すれば、重要な部分だけを取り出して整理し、読みやすい形式に自動的に整形することができました。アイデアはシンプルでした。私が手動で繰り返していたワークフローそのものを、単一のコマンドで実行できるものに変換するというものです。再利用可能なスクリプト。
このアイデアをテストするために、ランダムにエラーをスローしてログ ファイルに書き込む小さなデモ Web アプリを使用しました。フォローしたい場合は、コードを GitHub にアップしました。ただし、この正確な設定は必要ありません。ログをファイルに書き込むアプリケーションはすべて同じように動作します。現時点で問題となるのは、有用なエラーとその周囲のノイズが混在して増大するログ ファイルだけです。
毎回手動でログを調べる代わりに、退屈な部分を実行するための小さくてスマートな Python スクリプトを作成しました。考え方は簡単です。ログ ファイルを読み取り、エラー セクションだけを取り出してクリーンアップし、どこでも使用できる Markdown ファイルに保存します。スクリプトの最小バージョンは次のとおりです。
from datetime import datetime
LOG_FILE = "app.log"
def is_new_log_entry(line):
return any(level in line for level in ("INFO", "WARNING", "DEBUG", "ERROR"))
def extract_errors(lines):
errors = ()
current_error = ()
capturing = False
for line in lines:
if "ERROR" in line:
if current_error:
errors.append("".join(current_error))
current_error = ()
capturing = True
elif capturing and is_new_log_entry(line):
errors.append("".join(current_error))
current_error = ()
capturing = False
if capturing:
current_error.append(line)
if current_error:
errors.append("".join(current_error))
return errors
def format_markdown(errors):
formatted = ()
for i, error in enumerate(errors, 1):
block = f"### Error 関連情報は以下のリンクからご確認いただけます\n```\n公式情報はこちら\n```"
formatted.append(block)
return "\n".join(formatted)
def save_report(content):
timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M")
filename = f"error_report_関連情報は以下のリンクからご確認いただけます.md"
with open(filename, "w") as f:
f.write("# Error Report\n")
f.write(content)
print(f"Saved: 詳しい情報を見る")
def main():
with open(LOG_FILE, "r") as f:
lines = f.readlines()
errors = extract_errors(lines)
if not errors:
print("No errors found.")
return
report = format_markdown(errors)
save_report(report)
if __name__ == "__main__":
main()
ここでは 4 つの小さなステップが発生します。
- ログ ファイルを読み取ります。 スクリプトは、ログ ファイルを行のリストとしてメモリにロードします。これにより、大きなテキストの塊を処理するのではなく、一度に 1 ステップずつログを処理することが容易になります。
- エラー ログのみを抽出します。 行に「ERROR」が含まれる場合、スクリプトはそれを新しいエラー ブロックの始まりとして扱います。その時点から、完全なトレースバックを含む、そのエラーに属するすべての行の収集が開始されます。
- 完全なエラー ブロックをキャプチャします。 エラーの終了場所を推測する代わりに、スクリプトは新しいログ エントリ (「INFO」や別の「ERROR」など) の先頭に達するまで行を収集し続けます。これにより、何も切り取られることなくスタック トレース全体を取得できます。
- 出力をフォーマットします。 各エラーはクリーンな Markdown ブロックにラップされているため、読み取り、共有、他のツールへの貼り付けが簡単になります。
- タイムスタンプを付けて保存します。 最後に、スクリプトはタイムスタンプ付きの名前を持つ新しいファイルにすべてを書き込むため、以前のレポートは上書きされません。
error_report_2026-04-16_14-32.md
Excel の Python はプログラマーだけのものではありません – Python を使って今すぐできる 4 つの便利な機能
Excel を、データセットのクリーニング、日付の標準化、クラスターの視覚化、キーワードの分析のための軽量のデータ サイエンス ツールに変えます。
結果
スクリプトを実行するとワークフローがどのように見えるか
エラー エンドポイントに数回到達した後、生のログ ファイル (app.log) は次のようになりました。
2026-04-17 19:57:58,880 - INFO - Root endpoint was called
2026-04-17 19:58:17,147 - INFO - Root endpoint was called
2026-04-17 19:58:32,806 - INFO - Root endpoint was called
2026-04-17 19:58:42,878 - INFO - Error endpoint was called
2026-04-17 19:58:42,878 - ERROR - Exception occurred in /error endpoint
Traceback (most recent call last):
File ".../main.py", line 28, in trigger_error
result = 10 / 0
ZeroDivisionError: division by zero
2026-04-17 19:58:56,878 - INFO - Root endpoint was called
2026-04-17 19:58:59,833 - INFO - Root endpoint was called
2026-04-17 19:59:02,997 - INFO - Error endpoint was called
2026-04-17 19:59:02,997 - ERROR - Exception occurred in /error endpoint
Traceback (most recent call last):
File ".../main.py", line 28, in trigger_error
result = 10 / 0
ZeroDivisionError: division by zero
...
これには、成功したリクエスト、繰り返されるノイズ、そしてそれらの間に埋もれた実際のエラーなど、あらゆるものが混在しています。スクリプトを実行すると、きれいな Markdown レポートが得られました。
# Error Report
### Error 1
```
2026-04-17 19:58:42,878 - ERROR - Exception occurred in /error endpoint
Traceback (most recent call last):
File "D:\Content Writing\How-To Geek\automate logs\demo-webapp-error\main.py", line 28, in trigger_error
result = 10 / 0
~~~^~~
ZeroDivisionError: division by zero
```
...
各エラーは分離され、完全であり、読みやすく共有しやすい方法ですでにフォーマットされています。
このスクリプトを使用して、Slack、LLM、またはこのログをコピーして貼り付けるその他のサービスを統合することで、自動化を次のレベルに進めることができます。こうすることで、ログは希望する場所に自動的に到達します。
よくあるスクリプトの問題を解決する 18 の Bash 文字列トリック
これらの賢いテクニックを使用して、Bash 文字列のパワーを解き放ちます。
自動化で窮地を救える
これは楽しい実験でしたが、スクリプトと自動化に対する私の見方が変わりました。このようなシンプルだが便利な Python スクリプトのおかげで、何時間もの頭の痛い作業と手作業を節約することができました。
- ブランド
-
りんご
- オペレーティング·システム
-
macOS
このテーマについてさらに詳しく知りたい方は以下をご覧ください