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)
- Clipboard butonu — Kopyalama butonu JSON içeriyorsa:
<button data-clipboard-text='{"userId":"12345","level":"ERROR"}'>Copy</button>
- full_message alanı — Genişletilmiş mesaj JSON içeriyorsa:
<td data-field="full_message">{"userId":"12345","request":{...}}</td>
- 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
- Sayfada gerçekten log satırları var mı kontrol edin
- Graylog versiyonunuzun desteklendiğinden emin olun
Row Field Prefixesayarını kontrol edin- Tarayıcı konsolunda hata olup olmadığını kontrol edin
Yanlış alan değerleri
parseJsonStringsayarını kontrol edinjsonParseMaxDepthdeğerini artırmayı deneyin- JSON viewer ile ham verileri inceleyin