🦁

【Python】システムに取り込ませる用の構造化ログを自動生成する方法

に公開

はじめに

QA業務の現場で「ログをシステムに流し込んで動作確認をしたい」というケースは意外と多くあります。

特に構造化ログ(JSON形式など)を使っているシステムでは、

  • 「このログ形式で流し込んで動作確認して」
  • 「ログ受信処理が正しく動くか検証したい」

といったリクエストが日常的に発生します。

そこで今回は、構造化されたサンプルログを簡単に作成するコードを紹介します。


sample code


import os
from datetime import datetime

# 書き込む変数
# varAは固定
varA = "START_LOG"
varB_A = "これはfileA用のサンプルログ1"
varB_B = "これはfileB用のサンプルログ1"
varB_C = "これはfileC用のサンプルログ1"
varC_A = "これはfileA用のサンプルログ2"
varC_B = "これはfileB用のサンプルログ2"
varC_C = "これはfileC用のサンプルログ2"
varD_A = "これはfileA用のサンプルログ3"
varD_B = "これはfileB用のサンプルログ3"
varD_C = "これはfileC用のサンプルログ3"
#varEは固定
varE = "END_LOG"

# ファイル名
# 例(Windowsの場合): fileA = "C:\\log\\fileA.log"
# 例(Linuxの場合):   fileA = "/home/user/fileA.log"
fileA = "/tmp/test/fileA.log"
fileB = "/tmp/test/fileB.log"
fileC = "/tmp/test/fileC.log"

def write_log(filepath, values):
    """指定ファイルに現在時刻+各値を書き込む(各1行)"""
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    for v in values:
        input(f"\n次の処理: {filepath}{v} を書き込みます。エンターを押してください。")
        if v == varA or v == varE:
            print(f"{filepath}{v} を書き込みます。")
            line = f"{v}\n"
        else:
            print(f"{filepath}{now} {v} を書き込みます。")
            line = f"{now} {v}\n"
        with open(filepath, "a", encoding="utf-8") as f:
            f.write(line)

if __name__ == "__main__":
    # ファイルA作成
    print(f"これから {fileA} を作成します。")
    write_log(fileA, [varA, varB_A, varC_A, varD_A, varE])
    # ファイルB作成
    print(f"これから {fileB} を作成します。")
    write_log(fileB, [varA, varB_B, varC_B, varD_B, varE])
    # ファイルC作成
    print(f"これから {fileC} を作成します。")
    write_log(fileC, [varA, varB_C, varC_C, varD_C, varE])

    # 完了後、削除確認
    input("\n全ての処理が完了しました。作成したファイルを削除しますか?エンターを押すと削除します。")
    for f in [fileA, fileB, fileC]:
        if os.path.exists(f):
            os.remove(f)
            print(f"{f} を削除しました。")


実行時の標準出力

/usr/local/test/sample.py
これから /tmp/test/fileA.log を作成します。

次の処理: /tmp/test/fileA.log に START_LOG を書き込みます。エンターを押してください。
/tmp/test/fileA.log に START_LOG を書き込みます。

次の処理: /tmp/test/fileA.log に これはfileA用のサンプルログ1 を書き込みます。エンターを押してください。
/tmp/test/fileA.log に 2025-06-04 20:47:41 これはfileA用のサンプルログ1 を書き込みます。

次の処理: /tmp/test/fileA.log に これはfileA用のサンプルログ2 を書き込みます。エンターを押してください。
/tmp/test/fileA.log に 2025-06-04 20:47:41 これはfileA用のサンプルログ2 を書き込みます。

次の処理: /tmp/test/fileA.log に これはfileA用のサンプルログ3 を書き込みます。エンターを押してください。
/tmp/test/fileA.log に 2025-06-04 20:47:41 これはfileA用のサンプルログ3 を書き込みます。

次の処理: /tmp/test/fileA.log に END_LOG を書き込みます。エンターを押してください。
/tmp/test/fileA.log に END_LOG を書き込みます。
これから /tmp/test/fileB.log を作成します。

次の処理: /tmp/test/fileB.log に START_LOG を書き込みます。エンターを押してください。
/tmp/test/fileB.log に START_LOG を書き込みます。

次の処理: /tmp/test/fileB.log に これはfileB用のサンプルログ1 を書き込みます。エンターを押してください。
/tmp/test/fileB.log に 2025-06-04 20:47:46 これはfileB用のサンプルログ1 を書き込みます。

次の処理: /tmp/test/fileB.log に これはfileB用のサンプルログ2 を書き込みます。エンターを押してください。
/tmp/test/fileB.log に 2025-06-04 20:47:46 これはfileB用のサンプルログ2 を書き込みます。

次の処理: /tmp/test/fileB.log に これはfileB用のサンプルログ3 を書き込みます。エンターを押してください。
/tmp/test/fileB.log に 2025-06-04 20:47:46 これはfileB用のサンプルログ3 を書き込みます。

次の処理: /tmp/test/fileB.log に END_LOG を書き込みます。エンターを押してください。
/tmp/test/fileB.log に END_LOG を書き込みます。
これから /tmp/test/fileC.log を作成します。

次の処理: /tmp/test/fileC.log に START_LOG を書き込みます。エンターを押してください。
/tmp/test/fileC.log に START_LOG を書き込みます。

次の処理: /tmp/test/fileC.log に これはfileC用のサンプルログ1 を書き込みます。エンターを押してください。
/tmp/test/fileC.log に 2025-06-04 20:47:48 これはfileC用のサンプルログ1 を書き込みます。

次の処理: /tmp/test/fileC.log に これはfileC用のサンプルログ2 を書き込みます。エンターを押してください。
/tmp/test/fileC.log に 2025-06-04 20:47:48 これはfileC用のサンプルログ2 を書き込みます。

次の処理: /tmp/test/fileC.log に これはfileC用のサンプルログ3 を書き込みます。エンターを押してください。
/tmp/test/fileC.log に 2025-06-04 20:47:48 これはfileC用のサンプルログ3 を書き込みます。

次の処理: /tmp/test/fileC.log に END_LOG を書き込みます。エンターを押してください。
/tmp/test/fileC.log に END_LOG を書き込みます。

全ての処理が完了しました。作成したファイルを削除しますか?エンターを押すと削除します。
/tmp/test/fileA.log を削除しました。
/tmp/test/fileB.log を削除しました。
/tmp/test/fileC.log を削除しました。

処理の流れ

  1. 実行
  2. fileAが作成される
  3. エンターを押すごとにfileAに指定した文字列が出力される(3回)
  4. fileBが作成される
  5. エンターを押すごとにfileBに指定した文字列が出力される(3回)
  6. fileCが作成される
  7. エンターを押すごとにfileCに指定した文字列が出力される(3回)
  8. 作成したファイルを削除 or 削除しない を選択

作成されるファイルの例(一部)

$ cat fileA.log
START_LOG
2025-06-04 20:54:05 これはfileA用のサンプルログ1
2025-06-04 20:54:05 これはfileA用のサンプルログ2
2025-06-04 20:54:05 これはfileA用のサンプルログ3
END_LOG

📕補足

  • START_LOGなどを「 { 」に書き換えたり、END_LOGを「 } 」 に書き換えたりするとJSON形式っぽくなる。

Discussion