👋

【Python】PythonでCSV,JSON形式のサンプルログを作成する

に公開

以下の記事の追記として作成

【ログ作成】Pythonでサンプルログを作成する
https://zenn.dev/articles/b554901a39b25e/edit

新しく追加された機能

変数 output_format に以下のいずれかの値を設定することで、出力されるログのフォーマットを切り替えることができます:

"json":JSON形式(構造化ログ/機械処理向き)

"csv":カンマ区切り形式(表計算や可視化用途に便利)

"space":スペース区切りのシンプルなテキスト形式(grepなどCLI操作向け)

import random
import string
from datetime import datetime, timedelta
import csv
import json

# ======== 設定 ========

output_file = "sample_json.log"  # 出力ファイル名
total_entries = 10                   # 出力件数
output_format = "json"              # "space", "csv", "json" から選択

# サイズ帯(min, max)と出力件数(合計10件)
size_distribution = [
    ((20, 30), 2),   # 超軽量ログ 2件
    ((31, 50), 3),   # 軽量ログ 3件
    ((51, 80), 3),   # 中軽量ログ 3件
    ((81, 128), 2),  # やや長めログ 2件
]

# ランダム選択に使う値
ip_list = ["192.168.0.10", "10.0.0.1", "172.16.5.23"]
app_names = ["auth", "payment", "core"]
priorities = ["INFO", "WARN", "ERROR"]

# ======== エントリリスト生成 ========

log_entries = []
for (min_len, max_len), count in size_distribution:
    log_entries += [(min_len, max_len)] * count

# タイムスタンプの基準
start_time = datetime.now()

# ======== スペース区切り/CSV/JSONでログ出力 ========

if output_format == "space":
    with open(output_file, "w", encoding="utf-8") as f:
        for i, (min_len, max_len) in enumerate(log_entries):
            timestamp = (start_time + timedelta(seconds=i)).strftime("%Y-%m-%d %H:%M:%S")
            ip = random.choice(ip_list)
            priority = random.choice(priorities)
            app = random.choice(app_names)
            msg_len = random.randint(min_len, max_len)
            message = ''.join(random.choices(string.ascii_letters + string.digits, k=msg_len))
            line = f"{timestamp} {ip} {priority} {app} {message}"
            f.write(line + "\n")
elif output_format == "csv":
    with open(output_file, "w", encoding="utf-8", newline="") as f:
        writer = csv.writer(f)
        writer.writerow(["timestamp", "ip", "priority", "app", "message"])
        for i, (min_len, max_len) in enumerate(log_entries):
            timestamp = (start_time + timedelta(seconds=i)).strftime("%Y-%m-%d %H:%M:%S")
            ip = random.choice(ip_list)
            priority = random.choice(priorities)
            app = random.choice(app_names)
            msg_len = random.randint(min_len, max_len)
            message = ''.join(random.choices(string.ascii_letters + string.digits, k=msg_len))
            writer.writerow([timestamp, ip, priority, app, message])
elif output_format == "json":
    json_entries = []
    for i, (min_len, max_len) in enumerate(log_entries):
        timestamp = (start_time + timedelta(seconds=i)).strftime("%Y-%m-%d %H:%M:%S")
        ip = random.choice(ip_list)
        priority = random.choice(priorities)
        app = random.choice(app_names)
        msg_len = random.randint(min_len, max_len)
        message = ''.join(random.choices(string.ascii_letters + string.digits, k=msg_len))
        json_entries.append({
            "timestamp": timestamp,
            "ip": ip,
            "priority": priority,
            "app": app,
            "message": message
        })
    with open(output_file, "w", encoding="utf-8") as f:
        json.dump(json_entries, f, ensure_ascii=False, indent=2)

print(f"ログ出力完了: {output_file}{len(log_entries)}件, format={output_format})")

作成例1 (space区切り)

2025-06-04 21:05:56 10.0.0.1 WARN core g8KTqADWO6zp7Km4m307RlIz
2025-06-04 21:05:57 172.16.5.23 WARN core T4hFc5aoJQYE3HG9JGEBZNxCCCO50
2025-06-04 21:05:58 10.0.0.1 WARN auth UcYcib6yyHGw5nBJwhvPRlirat5LUVQfmsXinZQvy
2025-06-04 21:05:59 10.0.0.1 INFO payment 96sLg2YTEIN8U8eApqxoZkmqwrKtRCepjCjS
2025-06-04 21:06:00 192.168.0.10 WARN payment 5M7TWe6jjl7ddkgyt1NNUrODlGuKUlLG9cH0gGQ712vgqQkl
2025-06-04 21:06:01 192.168.0.10 INFO core JwjozMlPgK1fq2W998dHdqWd6Z2uTvhw75hjeHCQSx3OMpU3fB2IKOh0G0
2025-06-04 21:06:02 172.16.5.23 INFO auth unil0O0BlkPWUcwAZ2vAQlfjAKW9z5xOqRp6RmRfvtdo5u0IkeNY
2025-06-04 21:06:03 172.16.5.23 INFO core 5cNsiGEcW2KguV1ULv6sbiQrf9ly3vbKNpRmaShxb8qIL5X3F2FWYRtMiAEteTjIQ6cf8KseFpY
2025-06-04 21:06:04 192.168.0.10 WARN core Is7fFlb1eOkibRL1cmGCaenL2NJa4zVYN9uHcEwrdNyb0RtmFTIyPNfEhfr75mCbhsalKVx6NHZYQkx7K97JnydXjRuHYLY2vgyTRrc4PNCZpBnKOPRTejvjtD6
2025-06-04 21:06:05 10.0.0.1 INFO core Qq3s3LLHJHIEc68IdQoHMfBXGSXgbVbleUGq8iw3agWFo1ClwaLpe1cLfHjksnS8KT8tcT2x1vftEe7RsK7lZiUJB0L1UBwz2NohxClNWSZRyAQA5IwOihNcdWc2S

作成例2 (csv形式)

timestamp,ip,priority,app,message
2025-06-04 21:05:16,10.0.0.1,ERROR,core,vK9dLgCYObKMEhxXXUzDwael
2025-06-04 21:05:17,10.0.0.1,ERROR,core,TnXJ92twqWwOgmzSYVRKlfyvRiDOg
2025-06-04 21:05:18,10.0.0.1,ERROR,auth,vo2hlRlrLCFk27QjciM7pA7fsESHxVtnC3dfshzJXa
2025-06-04 21:05:19,10.0.0.1,WARN,auth,nwQcQmPTzQpQ9uWWc6mlE8iyjWaEl7GHXQ5Z
2025-06-04 21:05:20,172.16.5.23,INFO,auth,oiXznnh3pG5NX0QCnzBArGdSHq7P4ZKq9epU7YY
2025-06-04 21:05:21,10.0.0.1,INFO,payment,FzJSN9jirRIrtOCcAJkAsauburMWf3bO5uhIdnLy3WeSA2bJOJtbabN
2025-06-04 21:05:22,192.168.0.10,INFO,auth,CZzNcLP44kRUkkehNM9cmGRfFNxRqyMNHTLcySxckVeJUDPgeBywzlsPPyvgQMYmFcgfyoBU
2025-06-04 21:05:23,10.0.0.1,ERROR,auth,qB7oMOYxpTXHiJXE2AcVFnvXhegTFYvJC9rPmClUWkVnt9u1VB619
2025-06-04 21:05:24,10.0.0.1,INFO,payment,GGBaPjeAIkU27jDTCNLhTb82WmopVbJZ8WGoBd6lo83LFtm8KtVmEtzNtOQ3W3rnfxXnzCJtBAbgtixLb9aK
2025-06-04 21:05:25,172.16.5.23,WARN,auth,ivmeXQoIIoXEEEz3BVOlnShNT9BxxHurMN20aZLkVzOTQPEIFrAwhktbNh8FawfsX0CxjQ68rLah4jCWI2uQiBVegD210Xr

作成例3 (json形式)

[
  {
    "timestamp": "2025-06-04 21:06:24",
    "ip": "10.0.0.1",
    "priority": "INFO",
    "app": "core",
    "message": "OGUUyLIbi1X5Xi0kLTeedGKL"
  },
  {
    "timestamp": "2025-06-04 21:06:25",
    "ip": "10.0.0.1",
    "priority": "ERROR",
    "app": "core",
    "message": "IBSSJO34mlan1SFCz6gw6KC"
  },
  {
    "timestamp": "2025-06-04 21:06:26",
    "ip": "192.168.0.10",
    "priority": "ERROR",
    "app": "auth",
    "message": "DYyX2lk74Ddb3bTpnrv0uuBKvNWI2ZwNtt9bjns"
  },
  {
    "timestamp": "2025-06-04 21:06:27",
    "ip": "10.0.0.1",
    "priority": "ERROR",
    "app": "payment",
    "message": "ofD48PlXJkQ8EC5k81dtDc3m4nXUPUyfYdwYliAzgkDPmt4t"
  },
  {
    "timestamp": "2025-06-04 21:06:28",
    "ip": "172.16.5.23",
    "priority": "WARN",
    "app": "payment",
    "message": "DGgauWvFSXt9hMNO87DxmxqvGolCpxp"
  },
  {
    "timestamp": "2025-06-04 21:06:29",
    "ip": "10.0.0.1",
    "priority": "INFO",
    "app": "auth",
    "message": "DfxKDRSmEHd2CYOrnTINkxtGUmJOA9oFmMXdtX1CGerXEeJE0HhowOM60Lr9OzicX2C"
  },
  {
    "timestamp": "2025-06-04 21:06:30",
    "ip": "10.0.0.1",
    "priority": "WARN",
    "app": "auth",
    "message": "DTWIUuM8BVAfRaiZFDIYsPAAP0f2y0MDeHt1RjG25W6zdOcHBAuXqCWiKKokiVsEqCQAoxlEV6tnKVw"
  },
  {
    "timestamp": "2025-06-04 21:06:31",
    "ip": "172.16.5.23",
    "priority": "ERROR",
    "app": "core",
    "message": "1552mymsnouQ1q1MScfRu8h1I8SBUdRkfeGvKJGCHPvIrFyrCZ2m8F4SpIOVMNE9sXjxpE9"
  },
  {
    "timestamp": "2025-06-04 21:06:32",
    "ip": "10.0.0.1",
    "priority": "WARN",
    "app": "auth",
    "message": "V1i84Ufht80e9Sx0VFqnS6HmnDyOSZn6PZ6yGdxNUmCgJxtupHU90lghaZ9jVfyMAhwCQyjxsU71T0WVQlJjQgYckX"
  },
  {
    "timestamp": "2025-06-04 21:06:33",
    "ip": "10.0.0.1",
    "priority": "WARN",
    "app": "auth",
    "message": "lxqpHAEYOXpMlvB1nHOrzAF4iFeUxiBqF2ENQ1olcMd1yKlp7YDq3yEPLoUPs16WqSZh0V6j0Lx9ZmlJ5NGXwmmGLnwA8dsJkmdz38"
  }
]%        

Discussion