MENU
Apple製品を安く買うなら!詳細はこちら→ CLICK!

Pythonスクリプトを自動実行する際のおすすめのログの残し方

本ページにはプロモーションが含まれています。
python-log

こんにちは、fuyutsuki(@Fuyutsuki)です。

Pythonスクリプトを自動実行した際に、きちんとプログラムが動作しているのかをどうやって確認すれば良いんだ、と疑問に感じたことはありませんか?今回の記事ではそうした悩みを解決しますのでぜひ最後まで読んでください。

また、タスクスケジューラでPythonスクリプトを自動実行する手順の詳細についてはこちらの記事で解説しています。

目次

Pythonスクリプトを自動実行する際のおすすめのログの残し方

pythonでデバッグする際に、print()文を使っている方は多いのではないでしょうか。

しかし、pythonスクリプトを自動実行すると、print文で出力したログを確認できません。

そこで、logをテキストファイル形式で出力することをおすすめします。

logをテキストファイルで保存する

こちらのようにpythonコードを記載することでlogをテキスト形式で保存することができます。

ログファイルが重たくなりすぎることを防ぐために、一週間毎にログファイルをリセットするようにしています。

# ログファイルの設定
log_file = "program_log.txt"
def check_log_reset(log_file_name):
    """ログファイルがリセットされるべきかどうかを判断する"""
    # ファイルの最終更新日を取得
    if os.path.exists(log_file_name):
        last_modified = datetime.fromtimestamp(os.path.getmtime(log_file_name))
        now = datetime.now()
        # ここでリセットの条件を設定 (例: 一週間毎)
        if now - last_modified > timedelta(weeks=1):
            # 古いログファイルをリネームしてアーカイブ(オプション)
            os.rename(log_file_name, f"{log_file_name}_{last_modified.strftime('%Y%m%d')}")
            # 新しいログファイルを作成
            open(log_file_name, 'w').close()

def log_message(message):
    """ログメッセージをファイルに記録する関数"""
    check_log_reset(log_file)  # ログファイルのリセットチェックを追加
    with open(log_file, "a") as file:
        timestamp = datetime.now().strftime("%Y%m%d %H:%M:%S")
        file.write(f"{timestamp} - {message}\n")
    print(message)

def log_error(message, e):
    """エラーメッセージと例外の詳細をログに記録する関数"""
    error_message = f"{message}: {e}\n{traceback.format_exc()}"
    log_message(error_message)

log_message('処理を実行しました')

上記のpythonコードを実行すると、”時間”と”処理を実行しました”という単語がlogファイルのテキストファイルに保存されます。

スクリーンショットを撮る

webページを自動で操作するような場合ですと、処理毎にスクリーンショットを撮ることもおすすめです。

GoogleChromeでWebDriverを使用する際に、スクリーンショットを撮る例を示すpythonコードがこちらです。

# screenshotフォルダが存在しない場合は作成
folder_name_screeenshot = 'screenshot'
screeenshot_directory = os.path.join(current_directory, folder_name_screeenshot)
if not os.path.exists(screeenshot_directory):
    os.makedirs(screeenshot_directory)

def screenshot_filepath(filename):
    screenshot_directory_filepath = os.path.join(current_directory, screeenshot_directory)
    # スクリーンショットのファイル名(パスを含む)
    screenshot_file_path = os.path.join(screenshot_directory_filepath, filename+".png")
    print(screenshot_file_path)
    time.sleep(1)
    return screenshot_file_path

def safe_screenshot(driver, filename):
    try:
        # アラートが存在するかをチェック
        alert = driver.switch_to.alert
        alert_text = alert.text
        print(f"Alert found: {alert_text}")
        # アラートがあれば、それを解除
        alert.accept()
        print("Alert has been accepted.")
    except NoAlertPresentException:
        # アラートが存在しない場合は何もしない
        print("No alert present.")
    # アラートの処理後にスクリーンショットを取る
    screenshot_path = screenshot_filepath(filename)
    driver.get_screenshot_as_file(screenshot_path)

# Chromeオプションを設定
chrome_options = Options()
chrome_options.add_argument("--headless")  # ヘッドレスモードを有効化
chrome_options.add_argument("--window-size=1920,1080")  # ウィンドウサイズを指定
chrome_options.add_argument("log-level=3")
# WebDriverのセットアップ
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=chrome_options)
safe_screenshot(driver, "example")

上記のpythonコードを実行するとexample.pngという名前のスクリーンショットが保存されます。

まとめ:Pythonスクリプトを自動実行するならテキストファイルでログを残そう

今回はPythonスクリプトを自動実行した際に、プログラムがきちんと動作していることを確認するため、ログを残すおすすめの方法について解説しました。

Fuyutsuki

単純ですが、テキストファイルに”時間”と”処理内容”を保存していくのがおすすめです。

私のブログではPythonに関する記事を多く執筆しているため、ぜひまた記事を読みに来てください!

python-log

この記事が気に入ったら
フォローしてね!

この記事を書いた人

快適なデスク環境で作業効率アップをテーマに、様々なガジェットを紹介している20代エンジニアです。

作業効率化につながるようなプログラミングの情報についても発信中。

目次