📖

PythonでCURL自動化:定期実行とログ記録スクリプトの作り方

2024/09/11に公開

はじめに

こんにちは!今回は、定期的にcurlコマンドを実行し、その結果をログファイルに記録するPythonスクリプトを紹介します。このツールを作成した背景や使い方、さらにスクリプトの詳細について解説していきます。

作成した動機

最近、開発中のシステムでパフォーマンス情報の取得のためAPIの応答とタイムスタンプを定期的に監視しログ取得する必要がありました。。しかし、意外なことに、インターネット上でcurlの定期実行からログファイルに結果を格納する簡単なスクリプトがなかなか見つかりませんでした。あまり調べる時間がなかったからかもしれませんが...。

そこで、シンプルで使いやすい、かつカスタマイズ可能なスクリプトを自作することにしました。このブログでは、その成果を共有し、同様のニーズを持つ方々の助けになればと思います。

Pythonスクリプト

curl_interval_logger.py
import subprocess
import time
import datetime
import os
import argparse

def run_curl(url):
    start_time = time.time()
    result = subprocess.run(['curl', '-s', url], capture_output=True, text=True)
    end_time = time.time()
    execution_time = end_time - start_time
    return result.stdout, execution_time

def log_result(url, response, execution_time, log_file):
    timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    with open(log_file, 'a') as f:
        f.write(f"Timestamp: {timestamp}\n")
        f.write(f"URL: {url}\n")
        f.write(f"Execution Time: {execution_time:.4f} seconds\n")
        f.write(f"Response:\n{response}\n")
        f.write("-" * 50 + "\n")

def main():
    parser = argparse.ArgumentParser(description="Run curl at specified intervals and log results.")
    parser.add_argument("url", help="URL to curl")
    parser.add_argument("-i", "--interval", type=int, default=60, help="Interval between requests in seconds (default: 60)")
    parser.add_argument("-l", "--log", default="curl_log.txt", help="Log file name (default: curl_log.txt)")
    args = parser.parse_args()

    if not os.path.exists(args.log):
        open(args.log, 'w').close()

    print(f"Starting curl requests to {args.url} every {args.interval} seconds. Log file: {args.log}")
    print("Press Ctrl+C to stop the script.")

    try:
        while True:
            response, execution_time = run_curl(args.url)
            log_result(args.url, response, execution_time, args.log)
            print(f"Request completed. Execution time: {execution_time:.4f} seconds")
            time.sleep(args.interval)
    except KeyboardInterrupt:
        print("\nScript terminated by user.")

if __name__ == "__main__":
    main()

使い方

まず、スクリプトを curl_interval_logger.py という名前で保存しましょう。使い方は非常に簡単です:

python curl_interval_logger.py <URL> [-i INTERVAL] [-l LOG_FILE]

パラメータの説明:

  • <URL>: curl実行対象のURL(必須)
  • -i INTERVAL: リクエスト間隔(秒)。デフォルトは60秒
  • -l LOG_FILE: ログファイルの名前。デフォルトは "curl_log.txt"

使用例:

python curl_interval_logger.py http://httpbin.org/uuid  -i 30 -l my_log.txt

この例では、https://example.com に対して30秒ごとにcurlリクエストを実行し、結果を my_log.txt に記録します。

スクリプトを終了するには、Ctrl+Cを押してください。

スクリプトについて

このスクリプトは、以下の主要な機能を持っています:

  1. コマンドライン引数の解析 (argparse モジュール使用)
  2. 定期的なcurl実行 (subprocess モジュール使用)
  3. 実行時間の計測
  4. 結果のログファイルへの記録

主要な関数:

  1. run_curl(url):

    • 指定されたURLに対してcurlを実行
    • 実行時間を計測
    • レスポンスと実行時間を返す
  2. log_result(url, response, execution_time, log_file):

    • 結果をログファイルに記録
    • タイムスタンプ、URL、実行時間、レスポンスを含む
  3. main():

    • コマンドライン引数を解析
    • 無限ループでcurlを実行し、結果をログに記録
    • 指定された間隔で実行を繰り返す

スクリプトは argparse を使用してコマンドライン引数を解析し、ユーザーが簡単にURLや実行間隔、ログファイル名を指定できるようになっています。また、subprocess モジュールを使用してcurlコマンドを実行し、その出力を取得しています。

終わりに

このスクリプトを使用することで、Webサイトやサービスの応答時間の監視、APIの定期的なチェックなど、さまざまなタスクを自動化できます。また、ログファイルに記録された情報を分析することで、サービスのパフォーマンスの推移を追跡することも可能です。

皆さんのタスクの効率化にも役立てば幸いです。

Discussion