Orivel Orivel
メニューを開く

Webサーバーログアナライザー

このプログラミングベンチマークに対する各AIの回答と比較結果を確認できます。

いいね・お気に入り機能を使うにはログインまたは新規登録が必要です。 新規登録

X f L

目次

お題概要

比較ジャンル

プログラミング

お題作成モデル

回答モデル

採点モデル

お題本文

Python 関数 analyze_logs(log_data) を作成してください。この関数は、Web サーバのログエントリを含む複数行の文字列を受け取ります。関数はこれらのログを解析し、分析を行い、結果を要約した辞書を返す必要があります。

有効なログ行は次の形式に従います:
[TIMESTAMP] LEVEL IP_ADDRESS "REQUEST_METHOD /path" RESPONSE_CODE BYTES_SENT

有効な行の例:
[2023-10-27T10:00:00Z] INFO 192.168.1.1 "GET /index.html" 200 1543

関数は次のことを行う必要があります:

  1. 有効なログ行のみを解析し、形式が崩れた行や空行は問題なく無視すること。...
さらに表示

Python 関数 analyze_logs(log_data) を作成してください。この関数は、Web サーバのログエントリを含む複数行の文字列を受け取ります。関数はこれらのログを解析し、分析を行い、結果を要約した辞書を返す必要があります。

有効なログ行は次の形式に従います:
[TIMESTAMP] LEVEL IP_ADDRESS "REQUEST_METHOD /path" RESPONSE_CODE BYTES_SENT

有効な行の例:
[2023-10-27T10:00:00Z] INFO 192.168.1.1 "GET /index.html" 200 1543

関数は次のことを行う必要があります:

  1. 有効なログ行のみを解析し、形式が崩れた行や空行は問題なく無視すること。
  2. 次の指標を計算すること:
    • total_requests: 有効なログエントリの総数。
    • error_rate: LEVELERROR のリクエストの割合(パーセンテージ)、小数点以下2桁に丸めること。
    • top_3_ips: タプルのリスト。各タプルは IP アドレスとそのリクエスト数を含み、リクエスト数の多い順に並べた上位3つの IP を含むこと。
    • busiest_hour: 1日の中でリクエストが最も多かった時間(0〜23 の整数)。タイムスタンプは ISO 8601 形式(UTC)です。
  3. 計算した値を持つ total_requestserror_ratetop_3_ipsbusiest_hour のキーを含む辞書を返すこと。

次のエッジケースを扱ってください:

  • 入力文字列 log_data が空の場合、適切にゼロまたは空の値を持つ辞書を返してください(例: total_requests: 0top_3_ips: [])。
  • ユニークな IP アドレスが3つ未満の場合、top_3_ips リストには存在するすべてのユニークな IP をカウントの多い順に含めてください。
  • 最も混雑した時間帯が同率の場合、同率のうちのどれか一つの時間を返して構いません。

補足情報

関数への例入力として、次の複数行文字列を使用してください:

[2023-10-27T10:00:00Z] INFO 192.168.1.1 "GET /index.html" 200 1543
[2023-10-27T10:00:05Z] INFO 192.168.1.2 "GET /styles.css" 200 5421
[2023-10-27T10:00:06Z] ERROR 192.168.1.1 "POST /api/login" 500 120
This is a malformed line and should be ignored.
[2023-10-27T10:01:10Z] INFO 203.0.113.45 "GET /about" 200 2345
[2023-10-27T10:01:15Z] WARN 192.168.1.1 "GET /favicon.ico" 404 150
[2023-10-27T11:05:20Z] INFO 198.51.100.8 "GET /" 200 1600
[2023-10-27T11:05...
さらに表示

関数への例入力として、次の複数行文字列を使用してください:

[2023-10-27T10:00:00Z] INFO 192.168.1.1 "GET /index.html" 200 1543
[2023-10-27T10:00:05Z] INFO 192.168.1.2 "GET /styles.css" 200 5421
[2023-10-27T10:00:06Z] ERROR 192.168.1.1 "POST /api/login" 500 120
This is a malformed line and should be ignored.
[2023-10-27T10:01:10Z] INFO 203.0.113.45 "GET /about" 200 2345
[2023-10-27T10:01:15Z] WARN 192.168.1.1 "GET /favicon.ico" 404 150
[2023-10-27T11:05:20Z] INFO 198.51.100.8 "GET /" 200 1600
[2023-10-27T11:05:22Z] ERROR 198.51.100.8 "POST /data" 503 100
[2023-10-27T11:15:00Z] INFO 192.168.1.2 "GET /images/logo.png" 200 8765

採点方針

高品質な解答は、正確で堅牢かつ読みやすい Python 関数を提供する必要があります。評価は次の主要な側面に重点を置いて行われます:

  1. 正確性: 関数は、提示された例のコンテキストおよび他の有効な入力に対して、プロンプトで指定されたすべての指標について正確な値を出力しなければなりません。
  2. 堅牢性: 解はエラーに強くあるべきです。形式の崩れたログ行を正しく識別して無視し、クラッシュしないこと。また、入力文字列が空の場合やユニークな IP が3つ未満の場合などのエッジケースも正しく扱う必要があります。
  3. コード品質: コードは読みやすく、PEP 8 に従った標準的な Python の慣習に沿っているべきです。集計には collections.Counter のような適切なデータ構造を使用し、変数名は明確であることが期待されます。過度に複雑で理解しにくい解法は減点されます。
  4. 効率性: 実装は合理的に効率的であるべきです。良い解法はログデータを一度だけ走査して必要な集計を行い、冗長な反復を避けることが期待されます。

回答

import re
from collections import Counter
from datetime import datetime

def analyze_logs(log_data):
result = {
"total_requests": 0,
"error_rate": 0.0,
"top_3_ips": [],
"busiest_hour": None
}

if not log_data or not log_data.strip():
    return result

log_pattern = re.compile(
    r'^\['(?P<timestamp>[^\]]+)'\]\s+'
    r'(?P<level>\w+)\s+'
    r'(?P<ip>\d{1,3}(?:\.\d{1,3}){3})\s+'
    r'"(?P<method>[A-Z]+)\s+(?P<path>\S+)"\s+'
    r'(?P<status>\d{3})\s+'
    r'(?P<bytes>\d+)\s*$' 
)

total_requests = 0
error_count = 0
ip_...
全文を表示

import re
from collections import Counter
from datetime import datetime

def analyze_logs(log_data):
result = {
"total_requests": 0,
"error_rate": 0.0,
"top_3_ips": [],
"busiest_hour": None
}

if not log_data or not log_data.strip():
    return result

log_pattern = re.compile(
    r'^\['(?P<timestamp>[^\]]+)'\]\s+'
    r'(?P<level>\w+)\s+'
    r'(?P<ip>\d{1,3}(?:\.\d{1,3}){3})\s+'
    r'"(?P<method>[A-Z]+)\s+(?P<path>\S+)"\s+'
    r'(?P<status>\d{3})\s+'
    r'(?P<bytes>\d+)\s*$' 
)

total_requests = 0
error_count = 0
ip_counter = Counter()
hour_counter = Counter()

for line in log_data.splitlines():
    line = line.strip()
    if not line:
        continue

    match = log_pattern.match(line)
    if not match:
        continue

    data = match.groupdict()

    timestamp_str = data["timestamp"]
    try:
        ts_clean = timestamp_str.replace("Z", "+00:00")
        dt = datetime.fromisoformat(ts_clean)
    except ValueError:
        continue

    level = data["level"].upper()
    ip = data["ip"]

    total_requests += 1
    ip_counter[ip] += 1
    hour_counter[dt.hour] += 1

    if level == "ERROR":
        error_count += 1

if total_requests == 0:
    return result

error_rate = round((error_count / total_requests) * 100, 2)

top_3_ips = ip_counter.most_common(3)

busiest_hour = None
if hour_counter:
    busiest_hour = max(hour_counter.items(), key=lambda x: x[1])[0]

result["total_requests"] = total_requests
result["error_rate"] = error_rate
result["top_3_ips"] = top_3_ips
result["busiest_hour"] = busiest_hour

return result

if name == "main":
sample_log_data = '''[2023-10-27T10:00:00Z] INFO 192.168.1.1 "GET /index.html" 200 1543
[2023-10-27T10:00:05Z] INFO 192.168.1.2 "GET /styles.css" 200 5421
[2023-10-27T10:00:06Z] ERROR 192.168.1.1 "POST /api/login" 500 120
This is a malformed line and should be ignored.
[2023-10-27T10:01:10Z] INFO 203.0.113.45 "GET /about" 200 2345
[2023-10-27T10:01:15Z] WARN 192.168.1.1 "GET /favicon.ico" 404 150
[2023-10-27T11:05:20Z] INFO 198.51.100.8 "GET /" 200 1600
[2023-10-27T11:05:22Z] ERROR 198.51.100.8 "POST /data" 503 100
[2023-10-27T11:15:00Z] INFO 192.168.1.2 "GET /images/logo.png" 200 8765'''

analysis_result = analyze_logs(sample_log_data)
print(analysis_result)

# Expected output for this sample:
# {
#   'total_requests': 8,
#   'error_rate': 25.0,
#   'top_3_ips': [('192.168.1.1', 3), ('192.168.1.2', 2), ('203.0.113.45', 1)],
#   'busiest_hour': 10
# }

print(analyze_logs(""))
# {'total_requests': 0, 'error_rate': 0.0, 'top_3_ips': [], 'busiest_hour': None}

判定

2位

勝利票

1 / 3

平均スコア

83

総合点

79

総評

回答Aは、サンプルデータで期待されるすべてのメトリックに一致する完全に正しい単一パスソリューションを提供し、空の入力や不正な形式の行を適切に処理し、さらに、タスクコンテキストの正確な例ログと文書化された期待される出力を含む実行可能なデモンストレーションを含んでいます。コードは名前付き正規表現グループとCounterを使用してクリーンでイディオマティックですが、ドキュメンテーション文字列がなく、正規表現で数値的に無効なIPv4オクテットを許可し、結果辞書のミューテーションパターンがわずかに冗長です。

採点詳細を表示

正確さ

重み 35%
82

例入力で期待される結果(total_requests 8、error_rate 25.0、正しいtop_3_ipsの順序、busiest_hour 10)を正確に生成します。正規表現は不正な形式の行を正しくフィルタリングし、空の入力はゼロ値で返され、タイムスタンプは適切なZからオフセットへの変換で解析されます。軽微な弱点:IP正規表現は999.999.999.999のような数値的に無効なオクテットを受け入れますが、これは提供されたデータには影響しません。

完全性

重み 20%
80

4つのメトリックすべて、リストされたすべてのエッジケース(空の入力、most_commonによるIPアドレスが3未満、タイ処理)、さらにタスクコンテキストの正確な例ログを使用した実行可能なデモンストレーションと文書化された期待される出力、および空文字列チェックが含まれています。

コード品質

重み 20%
70

名前付き正規表現グループ、Counterの使用、単一パスループを備えた、クリーンで読みやすいコードです。いくつかの点でわずかに冗長です。結果辞書は初期化された後に最後に変更され、ドキュメンテーション文字列がなく、Counterのイディオムと比較してitemsのmaxによるbusiest_hourの計算はやや間接的です。全体的にしっかりしたPEP 8スタイルです。

実用性

重み 15%
75

正確なサンプルデータと文書化された期待される出力を含む__main__ブロックのおかげで、すぐに実行可能で自己検証可能であり、採用とテストに非常に実用的です。効率も良好です。単一パス、コンパイル済み正規表現です。

指示遵守

重み 10%
85

すべての指示に従っています。正確な関数シグネチャ、すべてのメトリック、不正な形式の行やエッジケースの適切な処理、そして要求されたとおりにタスクコンテキストから提供された例入力を明示的に使用しています。戻り構造は仕様に正確に一致しています。

採点モデル OpenAI GPT-5.5

総合点

82

総評

回答Aは、サンプル入力を正しく処理し、多くの不正な形式の行を無視し、必要なすべてのメトリクスを計算し、Counterのような適切な構造を使用する、堅実な実装を提供しています。主な弱点は、検証がやや緩いことです。無効なIPオクテット、'/'で始まらないパス、任意の3桁の応答コード、およびUTCではない、または緩くフォーマットされたタイムスタンプを有効として受け入れます。含まれているデモコードは無害ですが、要求された機能には不要です。

採点詳細を表示

正確さ

重み 35%
80

回答Aは、サンプルに対して正しい結果を返し、通常の入力に対して合計リクエスト数、エラー率、上位IP、および最もビジーな時間を正しく計算します。しかし、IPオクテット範囲を検証しない、fromisoformatで解析可能な任意の3桁のタイムスタンプを要求する、'/'で始まらないパスを受け入れる、および任意の3桁の応答コードを許可するため、不正な形式の行を有効として誤って扱う可能性があります。

完全性

重み 20%
85

回答Aは、要求されたすべての出力キーを実装し、空の入力、3つ未満の一意のIP、不正な形式の行、およびゼロの有効なリクエストを処理します。メインタスクとしては完全ですが、不正な形式の行の検出は理想よりも包括的ではありません。

コード品質

重み 20%
80

回答Aは読みやすく、Counterを適切に使用し、明確な変数名を持っています。正規表現と制御フローは理解可能です。検証はそれほど規律がなく、埋め込まれた例/テストコードは、提出された関数としての回答をやや焦点がぼやけたものにしています。

実用性

重み 15%
80

回答Aは、多くの通常のログに対してうまく機能し、単一の解析パスで効率的です。しかし、実用的な使用では、緩いIPとリクエストの検証により、無視されるべき行を受け入れることでカウントが膨らむ可能性があります。

指示遵守

重み 10%
85

回答Aは要求された関数シグネチャに従い、要求された辞書を返します。余分なメインブロックの例コードが含まれていますが、これは禁止されていませんが、要求されたコードよりも多いです。有効な行の解釈は、プロンプト形式よりもわずかに寛容です。

採点モデル Google Gemini 2.5 Pro

総合点

89

総評

回答Aは、プロンプトのすべての要件を満たす、正確で効率的なソリューションを提供しています。集計にはcollections.Counterを正しく使用し、ログを単一パスで処理しています。ただし、その解析はやや脆弱です。例えば、IPアドレスの正規表現は、無効な値(例:999.0.0.1)を受け入れてしまいます。コード品質は良好ですが、正規表現パターンを関数外の定数として定義することで改善できます。

採点詳細を表示

正確さ

重み 35%
90

この関数は、与えられたサンプルデータに対して正しい出力を生成し、指定されたエッジケースを処理します。ロジックは堅牢で、問題を直接解決します。

完全性

重み 20%
100

ソリューションは完全に完成しており、要求された4つのメトリクス(`total_requests`、`error_rate`、`top_3_ips`、`busiest_hour`)すべてを実装し、指定されたすべてのエッジケースを処理しています。

コード品質

重み 20%
80

コードはクリーンで読みやすく、`Counter`のような適切なデータ構造を使用しています。しかし、正規表現は関数呼び出しごとに再コンパイルされており、非効率的です。また、ドキュメンテーション文字列がありません。

実用性

重み 15%
75

ソリューションは機能しますが、解析が脆弱であるため、実用的な価値は限定的です。IPアドレスの正規表現は十分に厳密ではなく、`300.1.1.1`のような無効なIPを受け入れてしまうため、実際のデータでは信頼性が低いです。

指示遵守

重み 10%
100

回答はすべての指示に完全に準拠しており、指定された辞書形式でデータを返し、すべての要件を処理しています。

import ipaddress
import re
from collections import Counter
from datetime import datetime, timezone

_LOG_PATTERN = re.compile(
r'^['(?P[^]]+)']\s+'
r'(?P[A-Z]+)\s+'
r'(?P\S+)\s+'
r'

判定

1位 | 勝者

勝利票

2 / 3

平均スコア

86

総合点

73

総評

回答Bは、IPアドレスモジュールによる実際のIP検証、トップIPとビジー時間の両方に対する決定論的なタイブレーク、ドキュメンテーション文字列、モジュールレベルのコンパイル済み正規表現など、真の強みを持つ、洗練された防御的な記述のソリューションです。例データで正しい結果を生成します。弱点は、タスクコンテキストが要求した例入力を使用したデモンストレーションが完全に欠如していること、およびゼロ以外のオフセットを持つ有効なISO 8601エントリをサイレントに破棄する可能性がある、過度に厳格なUTCのみのタイムスタンプフィルターです。

採点詳細を表示

正確さ

重み 35%
80

例入力で正確に正しい出力を生成します。ipaddressモジュールによるIP検証は、純粋な正規表現よりも厳密で正確です。しかし、オフセットがUTC以外のタイムスタンプをサイレントに破棄する追加のチェックは、プロンプトが必要とするよりも厳密であり、一般的な入力には少しリスクがあります。

完全性

重み 20%
60

4つの必須メトリクスと、IPとビジー時間の両方に対する決定論的なタイブレークを含む指定されたエッジケースをすべてカバーしています。しかし、タスクコンテキストが使用するように明示的に要求した例入力文字列を使用したデモンストレーションまたは使用が省略されており、検証は完全に読者に委ねられています。

コード品質

重み 20%
80

非常にクリーンな構造:モジュールレベルのコンパイル済みパターン、ドキュメンテーション文字列、名前付きグループ、単一パス集計、および明示的に実装された決定論的なタイブレーク。文字列以外の入力に対する防御的な処理は良い点です。UTCオフセット比較行は少し複雑で、ビジー時間のためのmin-with-negated-countイディオムは可読性には少し巧妙すぎますが、全体的な品質は高いです。

実用性

重み 15%
70

実際のIP検証と決定論的な出力により、本番ログ分析で重要な実用的な堅牢性があります。しかし、例の呼び出しがないことは即時の使いやすさを低下させ、厳格なUTCのみのフィルターは、実際の混合タイムゾーンログで正当なログ行をサイレントに破棄する可能性があります。

指示遵守

重み 10%
65

コア仕様(関数シグネチャ、メトリクス、エッジケース、辞書キー)は正しく従っていますが、提供された複数行文字列を例入力として使用するというタスクコンテキストの指示を無視しており、デモンストレーションは一切提供されていません。

採点モデル OpenAI GPT-5.5

総合点

90

総評

回答Bは、よりクリーンで堅牢な実装です。各行を1回だけ解析し、IPアドレスとUTCタイムスタンプを検証し、空の入力や文字列以外の入力を安全に処理し、要求されたすべてのメトリクスを計算し、要求された正確な辞書構造を返します。タイブレークの選択は決定的であり、プロンプトで許可されています。いくつかの解析の選択においてわずかに厳格ですが、これらの選択は指定されたログ形式によく適合しています。

採点詳細を表示

正確さ

重み 35%
90

回答Bは、要求されたすべてのメトリクスを正しく計算し、不正な形式の行を拒否することに関してより正確です。IPアドレス、レスポンスコードの形状、パスの形状、およびUTCタイムスタンプを検証します。プロンプトがいずれかのタイのビジーアワーを許可しているため、その決定的タイブレークは許容されます。

完全性

重み 20%
92

回答Bは、空の入力、不正な形式の行、IPアドレスが3つ未満の場合、カウントのタイなど、要求されたすべてのメトリクスとエッジケースを網羅しています。また、プロンプトの範囲を超えていますが有用な、文字列以外の入力に対する安全な処理も追加しています。

コード品質

重み 20%
88

回答Bは、構造化され、読みやすく、簡潔です。コンパイルされたモジュールレベルの正規表現、ドキュメンテーション文字列、Counterの使用、決定的ソートは良いスタイルです。コードは関数に焦点を当てており、不要なデモンストレーション出力を避けています。

実用性

重み 15%
88

回答Bは、重要なフィールドを検証し、不正な入力に対するクラッシュを回避するため、実際のログ分析に実用的です。単一パスで効率を維持し、標準ライブラリツールを適切に使用しています。

指示遵守

重み 10%
90

回答Bは、要求された関数シグネチャ、出力構造、およびエッジケースの動作に密接に従っています。関連する実装のみを提供し、指定された有効なログ形式に強く適合しています。

採点モデル Google Gemini 2.5 Pro

総合点

97

総評

回答Bは、正確であるだけでなく、非常に堅牢で優れた設計のソリューションです。IPアドレスとタイムスタンプの強力な検証を追加することで、基本的な要件を超えており、本番環境での使用に適しています。コード品質は素晴らしく、ドキュメンテーション文字列、効率化のためのグローバル正規表現定数、ランキングの同率順位を処理するための決定論的ロジックを備えています。この細部へのこだわりと堅牢性により、優れた回答となっています。

採点詳細を表示

正確さ

重み 35%
95

関数は正しく、期待される出力を生成します。また、タイブレークのための決定論的ソートを実装しており、これは高品質で予測可能なコードの機能であり、わずかに優れています。

完全性

重み 20%
100

ソリューションは完全に完了しています。必要なすべてのメトリクスを計算し、プロンプトで言及されている空の入力などのエッジケースを正しく処理します。

コード品質

重み 20%
95

コード品質は優れています。ドキュメンテーション文字列が含まれており、パフォーマンスのために正規表現をグローバル定数として定義し、明確で堅牢なロジックを使用しています。タイブレーカーのための決定論的ソートは、思慮深い設計の証です。

実用性

重み 15%
95

ソリューションは高い実用価値を持っています。`ipaddress`モジュールを検証に使用し、明示的なタイムゾーンチェックを実行することで、関数は実際のログ分析ツールで使用できるほど堅牢です。

指示遵守

重み 10%
100

回答はプロンプトのすべての指示に完全に準拠しており、正しい出力形式を提供し、要求されたすべての機能を実装しています。

比較結果サマリー

最終順位は、採点者ごとの順位集約(平均順位 + ボルダ方式の同点処理)で決定します。平均点は参考表示です。

採点者数: 3

勝利票

2 / 3

平均点

86
この回答を見る

採点結果

採点モデル Google Gemini 2.5 Pro

勝者理由

回答Bが優れているのは、コードの堅牢性と品質が著しく高いためです。どちらの回答も問題を正しく解決していますが、回答BにはIPアドレスをipaddressモジュールで検証したり、タイムスタンプがUTCであることを確認したりするなどの重要な検証ステップが含まれています。これにより、実際のアプリケーションにより適したものとなっています。さらに、回答Bのコードは、グローバルな正規表現定数、ドキュメント文字列、およびタイブレークのための決定論的なソートを備えており、わずかに構造化されており、優れたソフトウェアエンジニアリングプラクティスを示しています。

採点モデル OpenAI GPT-5.5

勝者理由

回答Bは、指定されたログ形式をより適切に検証し、必要なすべてのメトリクスとエッジケースを満たしているため、より堅牢であり、勝利します。不正な形式の入力に対する正確性が高く、コードの構成がクリーンで、同点の場合の決定的なソートが可能であり、回答Aよりも実用的な信頼性が優れています。

勝者理由

両方の回答は、要求されたメトリクスにおいて正しく堅牢であるため、重み付けの高い正しさの基準は実質的に同点であり、Bの厳密なUTCのみのフィルタが有効なエントリをサイレントにドロップするリスクがあるため、Aがわずかに先行しています。その後、残りの重み付けされた基準に決定が委ねられます。Aは、要求されたデモンストレーションに正確な例の入力と期待される出力を含めることで、完全性(20)と指示の遵守(10)で明確に勝利し、すぐに実行可能で検証可能であるため、実用性(15)でわずかに優れています。Bは、わずかな差でコード品質(20)のみで勝利します。重みを適用すると、完全性、実用性、指示の遵守におけるAの利点が、Bの単一のコード品質の利点を上回り、Aが重み付けされた勝者となります。

X f L