# Hata Kayıtları

https://dev.wisecp.com/tr/hata-kayitlari

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 JavaScript PHP (HTTP) PHP (Dahili)

```bash
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
```

```javascript
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();
```

```php
$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);
```

```php
// 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 JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/tools/logs/errors/a1b2c3d4e5f600112233445566778899' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/tools/logs/errors/a1b2c3d4e5f600112233445566778899', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$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);
```

```php
// 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 JavaScript PHP (HTTP) PHP (Dahili)

```bash
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"]}'
```

```javascript
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();
```

```php
$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);
```

```php
// 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 JavaScript PHP (HTTP) PHP (Dahili)

```bash
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"}'
```

```javascript
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();
```

```php
$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);
```

```php
// 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 JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/tools/logs/errors/rebuild' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
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();
```

```php
$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);
```

```php
// 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 JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/tools/logs/settings' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/tools/logs/settings', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$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);
```

```php
$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 JavaScript PHP (HTTP) PHP (Dahili)

```bash
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}'
```

```javascript
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();
```

```php
$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);
```

```php
// 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.

## İlgili Makaleler

- [Kayıt Defterleri](https://dev.wisecp.com/tr/kayit-defterleri)
- [Modül Kuyruğu](https://dev.wisecp.com/tr/modul-kuyrugu)
