# Log Sistemi: sys_log ve Hata Kayıtları

TYPO3 v13'te loglama altyapısı, log yazıcıları ve hata kayıtlarının yönetimini kapsar.  
Framework PSR-3 standardına uygundur; FileWriter, DatabaseWriter ve SyslogWriter dahil birden fazla hedef desteklenir.

---

## TYPO3 Logging Framework

```
Uygulama Kodu
    │
    ▼
LogManager::getLogger(__CLASS__)
    │
    ▼
Logger (PSR-3)
    │
    ├── Processor 1  (IntrospectionProcessor — dosya/satır bilgisi ekler)
    ├── Processor 2  (MemoryUsageProcessor — bellek kullanımı ekler)
    │
    ├── Writer 1     (FileWriter → var/log/typo3_*.log)
    └── Writer 2     (DatabaseWriter → sys_log tablosu)
```

TYPO3, her namespace için ayrı writer/processor zinciri tanımlamaya olanak tanır.  
`writerConfiguration` anahtarı, belirtilen seviye **ve üzeri** tüm kayıtları yakalar.

### Log Seviyeleri (Düşükten Yükseğe)

| Seviye | PSR-3 Sabiti | Açıklama |
|--------|-------------|----------|
| `debug` | `LogLevel::DEBUG` | Hata ayıklama detayları |
| `info` | `LogLevel::INFO` | Genel bilgi |
| `notice` | `LogLevel::NOTICE` | Bilgilendirme (önemli) |
| `warning` | `LogLevel::WARNING` | Uyarı |
| `error` | `LogLevel::ERROR` | Hata durumu |
| `critical` | `LogLevel::CRITICAL` | Kritik hata |
| `alert` | `LogLevel::ALERT` | Acil müdahale gerekli |
| `emergency` | `LogLevel::EMERGENCY` | Sistem kullanılamaz |

> `LogLevel::WARNING` ayarlandığında `warning`, `error`, `critical`, `alert`, `emergency` hepsi yakalanır.

---

## Log Yapılandırması

### config/system/additional.php

```php
<?php

use Psr\Log\LogLevel;
use TYPO3\CMS\Core\Log\Writer\FileWriter;
use TYPO3\CMS\Core\Log\Writer\DatabaseWriter;
use TYPO3\CMS\Core\Log\Writer\SyslogWriter;
use TYPO3\CMS\Core\Log\Processor\IntrospectionProcessor;
use TYPO3\CMS\Core\Log\Processor\MemoryUsageProcessor;

// ─── Genel: WARNING ve üzeri dosyaya yaz ──────────────────────────────────────
$GLOBALS['TYPO3_CONF_VARS']['LOG']['writerConfiguration'] = [
    LogLevel::WARNING => [
        FileWriter::class => [
            'logFileInfix' => 'default',
        ],
    ],
];

// ─── ERROR ve üzeri veritabanına da yaz (sys_log) ────────────────────────────
$GLOBALS['TYPO3_CONF_VARS']['LOG']['writerConfiguration'][LogLevel::ERROR] = [
    DatabaseWriter::class => [],
];

// ─── Extension-özel loglama (proje namespace'i) ──────────────────────────────
$GLOBALS['TYPO3_CONF_VARS']['LOG']['Gfdhfhgfgg']['Testproject']['writerConfiguration'] = [
    LogLevel::DEBUG => [
        FileWriter::class => [
            'logFileInfix' => 'testproject',
        ],
    ],
];

// ─── Deprecation logları ─────────────────────────────────────────────────────
$GLOBALS['TYPO3_CONF_VARS']['LOG']['TYPO3']['CMS']['deprecations']['writerConfiguration'] = [
    LogLevel::NOTICE => [
        FileWriter::class => [
            'logFileInfix' => 'deprecations',
        ],
    ],
];

// ─── PHP hata raporlama seviyesi (sys_log'a yazan PHP hataları) ───────────────
// 0 = devre dışı, varsayılan: E_ALL & ~(E_STRICT | E_NOTICE)
$GLOBALS['TYPO3_CONF_VARS']['SYS']['belogErrorReporting'] = 'E_ALL & ~(E_STRICT | E_NOTICE)';
```

---

## Log Processors

Processor'lar, her log kaydını yazmadan önce ekstra bilgi ekler.

### Mevcut Processor'lar

| Processor | Eklenen Bilgi |
|-----------|---------------|
| `IntrospectionProcessor` | Dosya adı, satır numarası, sınıf ve method |
| `MemoryUsageProcessor` | PHP bellek kullanımı (formatlanmış veya byte) |
| `WebProcessor` | İstek URL'si, IP, HTTP method |
| `NullProcessor` | İşlem yapmaz (test ortamı için) |

### Processor Yapılandırması

```php
// Extension controller'larına IntrospectionProcessor ekle
$GLOBALS['TYPO3_CONF_VARS']['LOG']['Gfdhfhgfgg']['Testproject']['processorConfiguration'] = [
    \Psr\Log\LogLevel::ERROR => [
        \TYPO3\CMS\Core\Log\Processor\IntrospectionProcessor::class => [
            'appendFullBackTrace' => true,
        ],
        \TYPO3\CMS\Core\Log\Processor\MemoryUsageProcessor::class => [
            'formatSize' => true,
        ],
    ],
];
```

---

## Log Writer'ları

### Mevcut Writer'lar

| Writer | Açıklama | Hedef |
|--------|----------|-------|
| `FileWriter` | Dosyaya yazar | `var/log/typo3_*.log` |
| `DatabaseWriter` | Veritabanına yazar | `sys_log` tablosu |
| `SyslogWriter` | Sistem syslog'una yazar | `/var/log/syslog` |
| `NullWriter` | Hiçbir yere yazmaz | — |

### FileWriter Seçenekleri

```php
FileWriter::class => [
    'logFileInfix' => 'myapp',          // Dosya adı: typo3_myapp_<hash>.log
    // veya sabit dosya adı:
    'logFile' => \TYPO3\CMS\Core\Core\Environment::getVarPath() . '/log/myapp.log',
]
```

### SyslogWriter (production sunucu entegrasyonu)

```php
$GLOBALS['TYPO3_CONF_VARS']['LOG']['Gfdhfhgfgg']['Testproject']['Controller']['writerConfiguration'] = [
    \Psr\Log\LogLevel::WARNING => [
        \TYPO3\CMS\Core\Log\Writer\SyslogWriter::class => [],
    ],
];
```

---

## PHP'de Log Kullanımı

### Yöntem 1: Constructor Injection (Önerilen — v13)

`autowire: true` ile `LoggerInterface` otomatik enjekte edilir.

```php
<?php

declare(strict_types=1);

namespace Gfdhfhgfgg\Testproject\Service;

use Psr\Log\LoggerInterface;

final class MyService
{
    public function __construct(
        private readonly LoggerInterface $logger,
    ) {}

    public function process(int $uid): void
    {
        $this->logger->info('İşlem başlatıldı', ['uid' => $uid]);

        try {
            // ... iş mantığı ...
            $this->logger->debug('Alt adım tamamlandı', ['step' => 1, 'uid' => $uid]);
        } catch (\Throwable $e) {
            $this->logger->error('İşlem başarısız', [
                'uid'     => $uid,
                'message' => $e->getMessage(),
                'file'    => $e->getFile(),
                'line'    => $e->getLine(),
            ]);

            throw $e;
        }

        $this->logger->info('İşlem tamamlandı', ['uid' => $uid]);
    }
}
```

### Yöntem 2: LoggerAwareTrait

Autowiring devre dışıysa ya da manuel DI yapılıyorsa:

```php
<?php

declare(strict_types=1);

namespace Gfdhfhgfgg\Testproject\Service;

use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerAwareTrait;

class LegacyService implements LoggerAwareInterface
{
    use LoggerAwareTrait;

    public function doSomething(): void
    {
        $this->logger->warning('Eski yöntem kullanılıyor', [
            'method' => __METHOD__,
        ]);
    }
}
```

### Yöntem 3: LogManager (Statik — eski kod tabanı)

```php
<?php

use TYPO3\CMS\Core\Log\LogManager;
use TYPO3\CMS\Core\Utility\GeneralUtility;

$logger = GeneralUtility::makeInstance(LogManager::class)
    ->getLogger(__CLASS__);

$logger->notice('Statik bağlamda log', ['context' => 'value']);
```

---

## Log Kayıtlarında Context Kullanımı

```php
// Hata ile birlikte exception nesnesi
$this->logger->error('Veritabanı hatası', [
    'exception' => $e,           // TYPO3 mesaj ve trace'i otomatik çıkarır
    'query'     => $sql,
    'params'    => $params,
]);

// Özel bağlam verisi
$this->logger->info('Kullanıcı işlemi', [
    'userId'  => $GLOBALS['BE_USER']->user['uid'] ?? 0,
    'action'  => 'pageCreate',
    'pageId'  => $pageId,
    'ip'      => $_SERVER['REMOTE_ADDR'] ?? 'unknown',
]);
```

---

## Log Dosyaları

### Dizin Yapısı

```
var/log/
├── typo3_default_<hash>.log        # Genel WARNING+ loglar
├── typo3_deprecations_<hash>.log   # Deprecation NOTICE+ uyarıları
├── typo3_testproject_<hash>.log    # Proje extension logları (DEBUG+)
└── typo3_<hash>.log                # Hash'li genel dosya
```

### Log Satırı Formatı

```
Fri, 28 Feb 2026 14:23:01 +0000 [ERROR] request="7a3f..." component="Gfdhfhgfgg.Testproject.Service.MyService":
İşlem başarısız - {"uid": 42, "message": "Record not found"}
```

### DDEV — Log İzleme

```bash
# Canlı log takibi
ddev exec tail -f var/log/typo3_default_*.log

# Proje extension logları
ddev exec tail -f var/log/typo3_testproject_*.log

# Hata seviyesi ve üzeri filtrele
ddev exec grep '\[ERROR\]\|\[CRITICAL\]\|\[EMERGENCY\]' var/log/typo3_*.log

# Deprecation uyarıları
ddev exec tail -f var/log/typo3_deprecations_*.log

# Tüm log dosyalarını listele
ddev exec ls -lhS var/log/
```

---

## sys_log Tablosu

TYPO3 backend işlemleri ve PHP hataları `sys_log` tablosuna kaydedilir.

### Backend'de Görüntüleme

**System > Log** modülünde filtreleme seçenekleri:

| Sütun | Açıklama |
|-------|----------|
| `tstamp` | Unix timestamp |
| `userid` | Backend kullanıcı UID'si |
| `type` | Log tipi (aşağıya bakın) |
| `action` | Yapılan işlem kodu |
| `error` | Hata durumu (0=bilgi, 1=uyarı, 2=hata, 3=sistem hata) |
| `details` | Detay mesajı |
| `IP` | İstemci IP adresi |
| `tablename` | İşlem yapılan tablo |
| `recuid` | İşlem yapılan kayıt UID'si |

### sys_log Tip Kodları

| `type` | Açıklama |
|--------|----------|
| `1` | Backend kullanıcı işlemleri |
| `2` | Dosya işlemleri |
| `3` | Sayfa ağacı değişiklikleri |
| `4` | Uzantı/modül işlemleri |
| `255` | Giriş/Çıkış işlemleri |

### SQL ile Sorgulama

```sql
-- Son 100 log kaydı
SELECT tstamp, userid, type, error, details
FROM sys_log
ORDER BY tstamp DESC
LIMIT 100;

-- Hata kayıtları (error > 0)
SELECT FROM_UNIXTIME(tstamp) AS zaman, userid, type, error, details
FROM sys_log
WHERE error > 0
ORDER BY tstamp DESC
LIMIT 50;

-- Belirli kullanıcının işlemleri
SELECT FROM_UNIXTIME(tstamp) AS zaman, type, action, details
FROM sys_log
WHERE userid = 1
ORDER BY tstamp DESC;

-- Başarısız giriş denemeleri
SELECT FROM_UNIXTIME(tstamp) AS zaman, IP, details
FROM sys_log
WHERE type = 255
  AND error > 0
ORDER BY tstamp DESC;

-- Belirli tabloya yapılan işlemler
SELECT FROM_UNIXTIME(tstamp) AS zaman, userid, action, recuid
FROM sys_log
WHERE tablename = 'tx_news_domain_model_news'
ORDER BY tstamp DESC;

-- Son 24 saatteki hataları say
SELECT
    FROM_UNIXTIME(tstamp, '%Y-%m-%d %H:00') AS saat,
    COUNT(*) AS hata_sayisi
FROM sys_log
WHERE error > 0
  AND tstamp > UNIX_TIMESTAMP(NOW() - INTERVAL 24 HOUR)
GROUP BY saat
ORDER BY saat;
```

---

## Log Temizleme

### Manuel Temizleme

```bash
# Tüm log dosyalarını temizle
ddev exec rm var/log/typo3_*.log

# Belirli infix'li log dosyalarını temizle
ddev exec rm var/log/typo3_testproject_*.log
ddev exec rm var/log/typo3_deprecations_*.log

# sys_log tablosunu temizle (30 günden eski)
ddev mysql -e "DELETE FROM sys_log WHERE tstamp < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY));"
```

### Scheduler ile Otomatik Temizleme

Backend > **System > Scheduler** → Yeni görev ekle:

**Table garbage collection** görevi:
- **Table:** `sys_log`
- **Days:** `90` (90 günden eski kayıtları sil)
- **Frequency:** `0 3 * * 0` (Her Pazar 03:00)

Alternatif olarak projemizin `CleanupTask`'ı doğrudan `sys_log` temizler:

```php
// packages/testproject/Classes/Task/CleanupTask.php içinde:
// cleanupSysLog() metodu → tstamp < NOW - logRetentionDays
```

---

## Development vs Production Yapılandırması

```php
// config/system/additional.php — ortama göre log seviyesi

if (getenv('TYPO3_CONTEXT') === 'Development') {
    // Development: DEBUG seviyesinde tüm loglar dosyaya
    $GLOBALS['TYPO3_CONF_VARS']['LOG']['Gfdhfhgfgg']['Testproject']['writerConfiguration'] = [
        \Psr\Log\LogLevel::DEBUG => [
            \TYPO3\CMS\Core\Log\Writer\FileWriter::class => [
                'logFileInfix' => 'testproject_dev',
            ],
        ],
    ];
} else {
    // Production: Yalnızca WARNING+ logla
    $GLOBALS['TYPO3_CONF_VARS']['LOG']['Gfdhfhgfgg']['Testproject']['writerConfiguration'] = [
        \Psr\Log\LogLevel::WARNING => [
            \TYPO3\CMS\Core\Log\Writer\FileWriter::class => [
                'logFileInfix' => 'testproject',
            ],
        ],
        \Psr\Log\LogLevel::ERROR => [
            \TYPO3\CMS\Core\Log\Writer\DatabaseWriter::class => [],
        ],
    ];
}
```

---

## Kaynaklar

- [TYPO3 Logging Framework](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Logging/)
- [TYPO3 Log Writers](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Logging/Writers/)
- [TYPO3 Log Processors](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Logging/Processors/)
- [PSR-3 Logger Interface](https://www.php-fig.org/psr/psr-3/)
