Ana içeriğe geç

Alan Keşfi (Field Detection)

Graytool, log satırlarından alanları otomatik olarak keşfetmek için birden fazla strateji kullanır.

Keşif Stratejileri

Öncelik Sırası

1. Data Attributes (en yüksek) — data-field, data-testid
2. JSON Message Parsing — Clipboard, full_message, pre tags
3. DOM Patterns (en düşük) — dt/dd, field-name class

Her strateji bağımsız çalışır ve bulunan alanlar birleştirilip tekilleştirilir.

Strateji 1: Data Attributes

En güvenilir yöntem. Graylog'un DOM yapısındaki data attribute'larını okur.

Legacy Format

<td data-field="userId">12345</td>
<td data-field="source">api-gateway</td>

Modern Format (Graylog 5.x+)

<td data-testid="message-summary-field-userId">12345</td>
<td data-testid="message-summary-field-source">api-gateway</td>

Kaynak Tipi

source: "data-field"  // Öncelik: 4 (en yüksek)

Strateji 2: JSON Message Parsing

Log satırındaki JSON içeriğini bulur ve alanlarını çıkarır.

JSON Kaynakları (öncelik sırasıyla)

  1. Clipboard butonu — Kopyalama butonu JSON içeriyorsa:
<button data-clipboard-text='{"userId":"12345","level":"ERROR"}'>Copy</button>
  1. full_message alanı — Genişletilmiş mesaj JSON içeriyorsa:
<td data-field="full_message">{"userId":"12345","request":{...}}</td>
  1. Pre tags — Kod blokları JSON içeriyorsa:
<pre>{"userId":"12345","level":"ERROR"}</pre>

JSON Düzleştirme (Flatten)

İç içe JSON nesneleri düzleştirilir:

// Orijinal
{
"userId": "12345",
"context": {
"user": {
"name": "John",
"role": "admin"
}
},
"tags": ["api", "auth"]
}

// Düzleştirilmiş
{
"userId": "12345",
"context.user.name": "John",
"context.user.role": "admin",
"tags.0": "api",
"tags.1": "auth"
}

Derinlik Limiti

jsonParseMaxDepth ayarı ile kontrol edilir (varsayılan: 5):

Derinlik 0: { "a": { "b": { "c": "value" } } }
Derinlik 1: a → obje (devam)
Derinlik 2: a.b → obje (devam)
Derinlik 3: a.b.c → "value" (string, durdur)

JSON String Parsing

parseJsonStrings: true olduğunda, string değerlerde gömülü JSON aranır:

// Orijinal
{ "details": "{\"userId\": \"123\"}" }

// Parse sonucu
{ "details.userId": "123" }

Kaynak Tipi

source: "json-parse"  // Öncelik: 2

Strateji 3: DOM Patterns

Yapısal HTML elementlerinden alan keşfi yapar.

Description List (dt/dd)

Graylog'un genişletilmiş görünümünde:

<dl>
<dt>userId</dt>
<dd>12345</dd>
<dt>source</dt>
<dd>api-gateway</dd>
</dl>

Field Name Classes

<span class="field-name">userId</span>
<span class="field-value">12345</span>

Kaynak Tipi

source: "text-pattern"  // Öncelik: 1 (en düşük)

Tekilleştirme (Deduplication)

Aynı alan birden fazla strateji tarafından keşfedildiğinde, en yüksek öncelikli kaynak korunur:

Öncelik sırası:
data-field → 4 (en yüksek)
dom-attribute → 3
json-parse → 2
text-pattern → 1 (en düşük)

Örnek

"userId" bulundu:
- data-field: "12345" (öncelik 4) ← Seçilir ✅
- json-parse: "12345" (öncelik 2) ← Atlanır
- text-pattern: "12345" (öncelik 1) ← Atlanır

DiscoveredField Yapısı

interface DiscoveredField {
name: string; // Alan adı: "userId"
value: string; // Alan değeri: "12345"
source: FieldSource; // Keşif yöntemi: "data-field"
element?: Element; // DOM referansı (opsiyonel)
}

type FieldSource = "data-field" | "json-parse" | "text-pattern" | "dom-attribute";

Row Field Prefixes

Bazı Graylog yapılandırmaları alanlara prefix ekler. Graytool, yapılandırılmış prefix'leri arayarak eşleşme yapar:

Prefix'ler: ["msg.", "context.", ""]

Aranan alan: "userId"
Tarama sırası:
1. "msg.userId" → { source: "data-field", value: "12345" } ✅
2. "context.userId" → Bulunamadı
3. "userId" → Bulunamadı (zaten bulundu)

Sorun Giderme

Alanlar keşfedilmiyor

  1. Sayfada gerçekten log satırları var mı kontrol edin
  2. Graylog versiyonunuzun desteklendiğinden emin olun
  3. Row Field Prefixes ayarını kontrol edin
  4. Tarayıcı konsolunda hata olup olmadığını kontrol edin

Yanlış alan değerleri

  1. parseJsonStrings ayarını kontrol edin
  2. jsonParseMaxDepth değerini artırmayı deneyin
  3. JSON viewer ile ham verileri inceleyin