Hata Kayıtları

1.7k görüntülenme Markdown

Yakalanmış hataları okuyan, temizleyen ve kayıt ayarlarını yöneten yedi uç.

Genel Bakış

Bu yedi uç yakalanmış hataları okur, temizler ve hangi defterlerin tutulacağını ayarlar.

Bir satır bir olay değil bir sorundur. Aynı hata yüz kez tekrarlarsa tek satır kalır, sayacı artar ve son görülme zamanı yenilenir. Bu yüzden kayıtlar imzayla adreslenir, kimlikle değil.

Kayıtlar bir geçmiştir: bir satır "şu an bozuk" demez, "o an bozuktu" der. Bir hatayı düzeltmeye girişmeden önce hâlâ olup olmadığını ölçmek gerekir.

Referans

Hata Kayıtlarını Listeleme

get/api/v1/admin/tools/logs/errors
Tools/GetErrorLogs admin zengin süzgeç

Yakalanmış hataları döndürür. Her satır bir olay değil, bir sorundur.

Sorgu parametreleri — süzgeçler 14
searchstringKayıtlarda genel arama.
typesstringKayıt türüne göre süzer.
levelsstringÖnem düzeyine göre süzer.
signaturestringTek bir imzaya daraltır.
filestringHatanın geçtiği dosyaya göre süzer.
exception_classstringFırlatılan sınıfa göre süzer.
request_uristringİsteğin adresine göre süzer.
http_methodstringİstek yöntemine göre süzer.
user_idintKullanıcıya göre süzer.
ipstringAdrese göre süzer.
statusstringKaydın durumuna göre süzer.
min_occurrenceintEn az bu kadar tekrarlamış kayıtları verir. Tek seferlik gürültüyü elemenin en kolay yolu.
date_rangestringTarih aralığına göre süzer.
messagestringHata mesajında arar.
Sorgu parametreleri — düzen 5
hide_noiseboolGürültü sayılan kayıtları gizler.
orderstringSıralama alanı. Varsayılan son görülme.
directionstringSıralama yönü. Varsayılan azalan.
pageintVarsayılan 1.
limitintVarsayılan 25, en çok 100.
Dönen alanlar data[] — 15
idintSatır numarası.
signaturestringBu hatanın 32 karakterlik kimliği. Detay ve silme uçları bu kimlikle adreslenir.
typestringGeldiği defter: system ya da database.
levelstringŞiddeti; error, warning ya da fatal gibi.
countintBu kimliğin kaç kez görüldüğü. Tekrar yeni satır açmaz, bu sayıyı artırır.
first_seenstringİlk görülme zamanı.
last_seenstringSon görülme zamanı.
filestringKaynak dosya, kuruluma göre göreli verilir.
lineintKaynak satır.
message_previewstringKırpılmış mesaj. Tam gövde listede yoktur; detayda gelir.
exception_classstringHata bir throw'dan geldiyse fırlatılan sınıf.
request_uristringİstek yolu. İzin listesinde olmayan sorgu değerleri maskelenir.
request_methodstringİstek metodu.
user_idintİsteğe bağlı hesap. Kimse giriş yapmamışsa sıfır gelir.
ipstringİsteğin geldiği adres.
Meta 4
totalintSüzgece uyan toplam kayıt.
pageintBulunduğunuz sayfa.
limitintSayfa boyutu.
next_pageintSonraki sayfa. Sıfır son sayfada olduğunuz anlamına gelir.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -G 'https://panel.ornek.com/api/v1/admin/tools/logs/errors' \
  -H "Authorization: Bearer $API_KEY" \
  -d min_occurrence=5 \
  -d hide_noise=1
const url = new URL('https://panel.ornek.com/api/v1/admin/tools/logs/errors');
url.searchParams.set('min_occurrence', '5');
url.searchParams.set('hide_noise', '1');

const res  = await fetch(url, { headers: { Authorization: `Bearer ${apiKey}` } });
const body = await res.json();
$url = 'https://panel.ornek.com/api/v1/admin/tools/logs/errors?' . http_build_query([
    'min_occurrence' => 5,
    'hide_noise'     => 1,
]);

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Liste GOVDEYI tasimaz; yigin izini gormek icin tek kaydin detayini okuyun.
$errors = Api::Tools()->GetErrorLogs([], [
    'min_occurrence' => 5,
    'hide_noise'     => 1,
])['data'];

Hata Kaydı Detayı

get/api/v1/admin/tools/logs/errors/{signature}
Tools/GetErrorLog admin imzayla adreslenir

Tek bir hatayı, yığın izi ve isteğin bağlamıyla birlikte döndürür.

Sorgu parametreleri 1
typestringHangi defter: system ya da database. Varsayılan system; veritabanı hatası ararken açıkça vermeniz gerekir.
Dönen alanlar data — 16
——Liste satırının tüm alanları; listeleme ucuyla aynı şekildedir.
payloadobjectSaklanan bağlam: stack yalnız şekliyle, izin listesindeki istek alanları ve sunucu değerlerinin bir alt kümesi. Son görülüşe değil ilk görülüşe aittir; tekrar yalnız sayacı ve son görülme zamanını ilerletir.
Hatalar 3
signature_required422İmza 32 karakterlik onaltılık bir dize değil.
not_found404Bu imzayla kayıt yok. Yanlış defterde arıyor olabilirsiniz.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/tools/logs/errors/a1b2c3d4e5f600112233445566778899' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch('https://panel.ornek.com/api/v1/admin/tools/logs/errors/a1b2c3d4e5f600112233445566778899', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tools/logs/errors/a1b2c3d4e5f600112233445566778899');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Baglam ILK gorulduge aittir: sonraki tekrarlar sayaci artirir ama govdeyi degistirmez.
$log = Api::Tools()->GetErrorLog(['signature' => 'a1b2c3d4e5f600112233445566778899'])['data'];

Hata Kayıtlarını Silme

delete/api/v1/admin/tools/logs/errors
Tools/DeleteErrorLogs admin imza listesiyle

Seçtiğiniz hataları imzalarına göre siler.

Gövde 1
signaturesstring[]zorunluSilinecek imzalar. Her biri 32 karakterlik onaltılık dize olmalı.
Dönen alanlar data — 2
deletedboolSilme çalıştı mı.
countintSilinen kayıt sayısı. Gönderdiğiniz sayıdan az olabilir: eşleşmeyen imzalar sessizce atlanır.
Hatalar 2
signature_required422Geçerli en az bir imza verilmedi.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/tools/logs/errors' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"signatures":["a1b2c3d4e5f600112233445566778899"]}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/tools/logs/errors', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ signatures: ['a1b2c3d4e5f600112233445566778899'] }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tools/logs/errors');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['signatures' => ['a1b2c3d4e5f600112233445566778899']]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Silinen sayiyi gonderdiginizle karsilastirin: eslesmeyen imzalar sessizce atlanir.
$sent     = array_column($errors, 'signature');
$response = Api::Tools()->DeleteErrorLogs(['signatures' => $sent]);

$missed = count($sent) - $response['data']['count'];

Tarihe Göre Temizleme

post/api/v1/admin/tools/logs/errors/cleanup
Tools/CleanupErrorLogs admin geri alınamaz

Verilen tarihten eski hata kayıtlarını siler. İki defteri birden süpürür.

Gövde 1
beforestringzorunluKesim tarihi. Bu tarih ve öncesi silinir.
Dönen alanlar data — 3
clearedboolTemizlik çalıştı mı.
beforestringKullanılan kesim tarihi.
deletedobjectDefter başına silinen kayıt sayısı: sistem ve veritabanı.
Hatalar 2
invalid_date422Geçerli bir tarih verilmedi.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/tools/logs/errors/cleanup' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"before":"2026-01-01"}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/tools/logs/errors/cleanup', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ before: '2026-01-01' }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tools/logs/errors/cleanup');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['before' => '2026-01-01']),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Cozulmus gecmisi silmek sonraki her kaydi GERCEK bir sinyal yapar.
$response = Api::Tools()->CleanupErrorLogs(['before' => '2026-01-01']);

$system = $response['data']['deleted']['system'];

Eski Dosyaları İçe Aktarma

post/api/v1/admin/tools/logs/errors/rebuild
Tools/RebuildErrorLogs admin tek seferlik göç

Diskte kalmış eski hata dosyalarını okuyup kayıtlara aktarır.

Gövde —
——Gövde gerekmez, boş gönderin. Daraltacak bir alan yoktur; diskte ne kaldıysa alınır.
Dönen alanlar data — 2
rebuiltboolİşlem çalıştı mı.
countintİçe aktarılan kayıt sayısı. Aktarılacak dosya kalmadıysa sıfır.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/tools/logs/errors/rebuild' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch('https://panel.ornek.com/api/v1/admin/tools/logs/errors/rebuild', {
  method: 'POST',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tools/logs/errors/rebuild');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Bu bir INDEKS yeniden kurma degil, eski dosya deposundan ice aktarmadir.
// Aktarilanlar taze yakalamayla ayni temizlemeden gecer.
$response = Api::Tools()->RebuildErrorLogs();

Kayıt Ayarlarını Getirme

get/api/v1/admin/tools/logs/settings
Tools/GetLogSettings admin

Hangi defterlerin tutulduğunu ve hata ayıklamanın açık olup olmadığını döndürür.

Dönen alanlar data — 6
error_logboolHata kaydı tutuluyor mu.
error_debugboolHata ayrıntısı gösteriliyor mu.
developmentboolGeliştirme kipi açık mı.
module_logboolModül görüşmeleri kaydediliyor mu.
query_loggingboolVeritabanı sorguları kaydediliyor mu.
query_logging_ipsstring[]Sorgu kaydının yalnız hangi adresler için tutulacağı.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/tools/logs/settings' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch('https://panel.ornek.com/api/v1/admin/tools/logs/settings', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tools/logs/settings');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
$response = Api::Tools()->GetLogSettings();

Kayıt Ayarlarını Yazma

put/api/v1/admin/tools/logs/settings
Tools/UpdateLogSettings admin canlıda dikkat

Hangi defterlerin tutulacağını ve hata ayıklamanın açık olup olmayacağını yazar.

Gövde 6
error_logintHata kaydını açar ya da kapatır.
error_debugintHata ayrıntısını gösterir. Ziyaretçiye iç bilgi sızdırır; canlıda kapalı tutun.
developmentintGeliştirme kipini açar.
module_logintModül görüşmelerini kaydeder. Hızla büyür.
query_loggingintVeritabanı sorgularını kaydeder. Çok hızlı büyür; adres sınırıyla birlikte kullanın.
query_logging_ipsstring[] | stringSorgu kaydının tutulacağı adresler. Kendi adresinizi verirseniz kayıt yalnız sizin isteklerinizde tutulur.
Dönen alanlar data — 6
dataobjectGüncel ayarlar. Okuma ucuyla aynı şekildedir. Değişen tek şey gönderdiğiniz anahtarlardır, ama yanıt kümenin tamamını taşır; kurulumun son durumunu buradan doğrulayabilirsiniz.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X PUT 'https://panel.ornek.com/api/v1/admin/tools/logs/settings' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"error_log":1,"module_log":0}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/tools/logs/settings', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ error_log: 1, module_log: 0 }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tools/logs/settings');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'error_log'  => 1,
        'module_log' => 0,
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Sorgu kaydini yalniz kendi adresinizde acin: acik birakildiginda disk hizla dolar.
Api::Tools()->UpdateLogSettings([
    'query_logging'     => 1,
    'query_logging_ips' => ['203.0.113.5'],
]);

Tuzaklar

Kayıt geçmiştir, şimdiki durum değil

Uzun bir hata listesi, o kadar açık sorun olduğu anlamına gelmez: çoğu kayıt çoktan düzeltilmiş olabilir. Bir hatanın hâlâ yaşandığını anlamanın yolu sayacı okumak, ilgili sayfaya birkaç istek atmak ve sayacı yeniden okumaktır. Kımıldamıyorsa düzeltilecek bir şey yoktur.

Bağlam ilk görülüşe aittir

Detaydaki yığın izi, adres ve kullanıcı bilgisi hatanın ilk yakalandığı andan gelir; sonraki tekrarlar yalnız sayacı ve son görülme zamanını günceller. Yani bugünkü bir tekrarı aylar önceki bir bağlamla okuyor olabilirsiniz.

İki ayrı defter vardır

Sistem hataları ve veritabanı hataları ayrı tutulur. Detay ucu varsayılan olarak sistem defterine bakar; veritabanı hatasının imzasını verip türü belirtmezseniz kayıt bulunamaz. Tarihe göre temizlik ise ikisini birden süpürür.

Sorgu kaydı diski hızla doldurur

Veritabanı sorgu kaydı her isteği yazar ve açık bırakıldığında hızla büyür. Adres sınırıyla birlikte kullanın: yalnız kendi adresinizi verirseniz kayıt sizin isteklerinizle sınırlı kalır. Aynı şekilde hata ayrıntısını canlıda açık bırakmak ziyaretçiye iç bilgi gösterir.

Yeniden kurma bir indeks işlemi değildir

Adı öyle dursa da bu uç bir indeks yeniden kurmaz: diskte kalmış eski dosya deposundan içe aktarım yapar. Aktaracak dosya kalmadıysa sıfır döner, bu bir hata değildir. İçe alınan eski gövdeler taze yakalamayla aynı temizlemeden geçer.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.