第116回 実務で使えるPython基礎:設定・引数・ロギングで作る堅牢な自動化スクリプト

既存のバッチやデータ処理スクリプトを運用に回すとき、設定やログ周りでつまずくことがよくあります。動作は一時的に確認できても、引数の優先順やログ肥大、例外未処理で現場運用が止まる――こうした課題に寄り添い、短時間で改善できる手順とテンプレートを示します。

1) なぜ設定とログが必要か(実務シナリオ)

現場では以下のような場面で設定とログが役に立ちます。

  • 運用者がパラメータを変えて再実行したい(CLIを優先)
  • CI/CDやコンテナ、cronからは環境変数で制御したい
  • 問題発生時に原因追跡しやすいログが必要(処理ID、入力ファイル名、タイムスタンプ)
  • ログが肥大化しないようにローテーション管理が必要

2) 設定の設計ルール

明確な優先順位を決めると混乱が減ります。ここでは実務でよく使う順です。

優先度 取得元 想定用途
1 CLI引数(argparse) 一時的な上書きやサブコマンド操作
2 環境変数 CI/コンテナ/cronなどの外部制御
3 設定ファイル(YAML/INI) 頻繁には変えない運用設定
4 コード内デフォルト 最小限の安全な初期値

優先順位をコードに明示的に反映させるとトラブル防止になります(例:CLIが指定されれば環境変数は無視)。

3) argparse の実務テンプレート(サブコマンド含む)

コピー&ペーストで使える最小テンプレートです。main関数を分離してユニットテストしやすくしています。

実装メモ: コード例は環境に合わせて調整してください。例: import argparse

テストしやすくするポイント:main に argv を渡せるようにしておく(依存注入)。処理本体は別関数に切り出すとユニットテストが容易になります。

4) 設定ファイル(INI/YAML)と環境変数の読み方

簡易例を示します。YAML は可読性が高く運用向けです。環境変数は os.environ.get で取得し、CLIの値があればそちらで上書きします。

実装メモ: コード例は環境に合わせて調整してください。例: import yaml

5) logging の実務設定(コンソール・ファイル回転・フォーマット)

最低限入れるべき情報:timestamp、レベル、処理ID(トレース用)、モジュール・メッセージ。RotatingFileHandler でログ肥大を防ぎます。

実装メモ: コード例は環境に合わせて調整してください。例: import logging

運用のヒント:

  • ログレベルは環境別に変える(開発は DEBUG、運用は INFO/WARN)。
  • ログメッセージに入力ファイル名・処理IDを入れると問題解析が速い。
  • 機密情報はログに書かない。必要なら redaction を入れる。

6) 例外・終了コード・簡単な自己診断(ヘルスチェック)

スクリプトは明確な終了コードを返し、呼び出し元(cron/systemd)で判定できるようにします。軽い健常性チェックで依存先の可用性を確認しておくと安心です。

実装メモ: コード例は環境に合わせて調整してください。例: import sys

終了コードの例:

終了コード 意味
0 正常終了
1 一般エラー(非特定)
2 ヘルスチェック失敗
3 入力ファイルなどのリソース不足

7) 実運用チェックリストとデプロイ例(cron/systemd/コンテナ)

導入後に最低限確認すべき項目を表にまとめます。

項目 確認内容
設定優先順 CLI > 環境変数 > 設定ファイル > デフォルト が実装されている
ログ回転 RotatingFileHandler で maxBytes/backupCount が設定されている
ログ形式 timestamp・level・trace_id・処理名が含まれている
例外管理 例外はログに残り、終了コードで判定できる
機密情報 ログにパスワードなどを吐かないフィルタがある
監視接続 cron/systemd の再試行、Prometheus による簡易ヘルス検出(任意)

デプロイ例(概要):

  • cron: 定期実行。ログローテートはアプリ側で行い、stderr/stdout はログにまとめる。終了コードでアラート連携。
  • systemd: Restart=on-failure や RestartSec を使って自動復旧を設定。
  • コンテナ: 健康チェック(HEALTHCHECK)や liveness/readiness を設定し、ログはコンテナ標準出力に出して別サービスで集約。

失敗しやすい点と回避策(短いチェックリスト)

失敗 対策
設定の優先順が不明瞭 コード冒頭で優先順を明示し、ドキュメント化する
ログが大量に溜まる RotatingFileHandler を導入、DEBUG は必要時のみ有効化
重要情報がログに残る ログ出力前に redaction ルールを適用
例外がハンドルされずプロセスが落ちる トップレベルで例外をログ化し適切な終了コードで終了

想定実装時間(既存スクリプトに適用する場合)

作業 想定時間
最低限の argparse + logging 導入 30分
設定ファイル・環境変数対応の実装 1〜2時間
運用チェックリスト適用・監視連携 半日

まとめ

本記事では、短時間で既存スクリプトを運用に耐える形にするための設計ルールとテンプレートを示しました。学習ゴールに沿って整理すると、以下が実践できるようになります。

  • CLI > 環境変数 > 設定ファイル > デフォルトの優先順位設計
  • argparse を使った実務テンプレート(サブコマンド対応)
  • logging の基本設定、RotatingFileHandler、trace_id を含むフォーマット
  • 終了コード・例外ハンドリング・簡単なヘルスチェックの導入

まずは「30分で最低限の argparse+logging 導入」から試してみてください。次回は監視と自動復旧(systemd/コンテナでのリトライ設計)について扱い、運用の自動化をさらに進めます。