trustgraph/docs/tech-specs/logging-strategy.tr.md

359 lines
11 KiB
Markdown
Raw Normal View History

---
layout: default
title: "TrustGraph Kayıt (Log) Stratejisi"
parent: "Turkish (Beta)"
---
# TrustGraph Kayıt (Log) Stratejisi
> **Beta Translation:** This document was translated via Machine Learning and as such may not be 100% accurate. All non-English languages are currently classified as Beta.
## Genel Bakış
TrustGraph, tüm kayıt işlemlerinde Python'un yerleşik `logging` modülünü kullanır, merkezi yapılandırma ve kayıt toplama için isteğe bağlı Loki entegrasyonuna sahiptir. Bu, sistemin tüm bileşenleri için standartlaştırılmış, esnek bir kayıt yaklaşımı sağlar.
## Varsayılan Yapılandırma
### Kayıt Seviyesi
**Varsayılan Seviye**: `INFO`
**Yapılandırılabilir**: `--log-level` komut satırı argümanı aracılığıyla
**Seçenekler**: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`
### Çıkış Hedefleri
1. **Konsol (stdout)**: Her zaman etkindir - konteynerleştirilmiş ortamlarla uyumluluğu sağlar.
2. **Loki**: İsteğe bağlı, merkezi kayıt toplama (varsayılan olarak etkindir, devre dışı bırakılabilir).
## Merkezi Kayıt Modülü
Tüm kayıt yapılandırması, aşağıdaki özellikleri sağlayan `trustgraph.base.logging` modülü tarafından yönetilir:
`add_logging_args(parser)` - Standart kayıt komut satırı argümanlarını ekler.
`setup_logging(args)` - Ayrıştırılmış argümanlardan kaydı yapılandırır.
Bu modül, tüm sunucu tarafı bileşenleri tarafından kullanılır:
AsyncProcessor tabanlı hizmetler
API Ağ Geçidi
MCP Sunucusu
## Uygulama Yönergeleri
### 1. Kayıt Oluşturucu Başlatma
Her modül, modülün `__name__`'ını kullanarak kendi kayıt oluşturucusunu oluşturmalıdır:
```python
import logging
logger = logging.getLogger(__name__)
```
Kayıt günlüğünün adı, Loki'de filtreleme ve arama için otomatik olarak bir etiket olarak kullanılır.
### 2. Hizmet Başlatma
Tüm sunucu tarafı hizmetleri, merkezi modül aracılığıyla otomatik olarak günlük yapılandırması alır:
```python
from trustgraph.base import add_logging_args, setup_logging
import argparse
def main():
parser = argparse.ArgumentParser()
# Add standard logging arguments (includes Loki configuration)
add_logging_args(parser)
# Add your service-specific arguments
parser.add_argument('--port', type=int, default=8080)
args = parser.parse_args()
args = vars(args)
# Setup logging early in startup
setup_logging(args)
# Rest of your service initialization
logger = logging.getLogger(__name__)
logger.info("Service starting...")
```
### 3. Komut Satırı Argümanları
Tüm hizmetler bu günlük kaydı argümanlarını destekler:
**Günlük Seviyesi:**
```bash
--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
```
**Loki Yapılandırması:**
```bash
--loki-enabled # Enable Loki (default)
--no-loki-enabled # Disable Loki
--loki-url URL # Loki push URL (default: http://loki:3100/loki/api/v1/push)
--loki-username USERNAME # Optional authentication
--loki-password PASSWORD # Optional authentication
```
**Örnekler:**
```bash
# Default - INFO level, Loki enabled
./my-service
# Debug mode, console only
./my-service --log-level DEBUG --no-loki-enabled
# Custom Loki server with auth
./my-service --loki-url http://loki.prod:3100/loki/api/v1/push \
--loki-username admin --loki-password secret
```
### 4. Ortam Değişkenleri
Loki yapılandırması, ortam değişkeni geri dönüşlerini destekler:
```bash
export LOKI_URL=http://loki.prod:3100/loki/api/v1/push
export LOKI_USERNAME=admin
export LOKI_PASSWORD=secret
```
Komut satırı argümanları, ortam değişkenlerine göre önceliklidir.
### 5. Kayıt (Logging) İçin En İyi Uygulamalar
#### Kayıt Seviyelerinin Kullanımı
**DEBUG**: Sorunları teşhis etmek için detaylı bilgiler (değişken değerleri, fonksiyon giriş/çıkış)
**INFO**: Genel bilgilendirici mesajlar (hizmet başlatıldı, yapılandırma yüklendi, işlem aşamaları)
**WARNING**: Potansiyel olarak tehlikeli durumlara yönelik uyarı mesajları (kullanımdan kaldırılmış özellikler, düzeltilebilir hatalar)
**ERROR**: Ciddi sorunlara yönelik hata mesajları (başarısız işlemler, istisnalar)
**CRITICAL**: Acil müdahale gerektiren sistem arızalarına yönelik kritik mesajlar
#### Mesaj Formatı
```python
# Good - includes context
logger.info(f"Processing document: {doc_id}, size: {doc_size} bytes")
logger.error(f"Failed to connect to database: {error}", exc_info=True)
# Avoid - lacks context
logger.info("Processing document")
logger.error("Connection failed")
```
#### Performans Hususları
```python
# Use lazy formatting for expensive operations
logger.debug("Expensive operation result: %s", expensive_function())
# Check log level for very expensive debug operations
if logger.isEnabledFor(logging.DEBUG):
debug_data = compute_expensive_debug_info()
logger.debug(f"Debug data: {debug_data}")
```
### 6. Loki ile Yapılandırılmış Günlüğe Kayıt
Karmaşık veriler için, Loki için ek etiketlerle yapılandırılmış günlüğe kaydı kullanın:
```python
logger.info("Request processed", extra={
'tags': {
'request_id': request_id,
'user_id': user_id,
'status': 'success'
}
})
```
Bu etiketler, otomatik etiketlerin yanı sıra, Loki'de aranabilir etiketler haline gelir:
`severity` - Log seviyesi (DEBUG, INFO, WARNING, ERROR, CRITICAL)
`logger` - Modül adı (`__name__`'den)
### 7. İstisna Kaydı
İstisnalar için her zaman yığın izlerini ekleyin:
```python
try:
process_data()
except Exception as e:
logger.error(f"Failed to process data: {e}", exc_info=True)
raise
```
### 8. Asenkron Kayıt (Logging) Hususları
Kayıt sistemi, Loki için engellemeyen, kuyruklu işleyiciler kullanır:
Konsol çıktısı senkron (hızlıdır)
Loki çıktısı, 500 mesajlık bir arabellekle kuyruğa alınır
Arka plan iş parçacığı, Loki iletimini yönetir
Ana uygulama kodunun engellenmesi olmaz
```python
import asyncio
import logging
async def async_operation():
logger = logging.getLogger(__name__)
# Logging is thread-safe and won't block async operations
logger.info(f"Starting async operation in task: {asyncio.current_task().get_name()}")
```
## Loki Entegrasyonu
### Mimari
Günlük sistemi, engellemeyen Loki entegrasyonu için Python'un yerleşik `QueueHandler` ve `QueueListener` özelliklerini kullanır:
1. **QueueHandler**: Günlükler, 500 mesajlık bir kuyruğa (engellemesiz) yerleştirilir.
2. **Arka Plan İş Parçacığı**: QueueListener, günlükleri Loki'ye asenkron olarak gönderir.
3. **Usulüne Uygun Bozulma**: Loki kullanılamıyorsa, konsol günlüğü devam eder.
### Otomatik Etiketler
Loki'ye gönderilen her günlük şunları içerir:
`processor`: İşlemci kimliği (örneğin, `config-svc`, `text-completion`, `embeddings`)
`severity`: Günlük seviyesi (DEBUG, INFO, vb.)
`logger`: Modül adı (örneğin, `trustgraph.gateway.service`, `trustgraph.agent.react.service`)
### Özel Etiketler
Özel etiketleri `extra` parametresi aracılığıyla ekleyin:
```python
logger.info("User action", extra={
'tags': {
'user_id': user_id,
'action': 'document_upload',
'collection': collection_name
}
})
```
### Loki'de Logları Sorgulama
```logql
# All logs from a specific processor (recommended - matches Prometheus metrics)
{processor="config-svc"}
{processor="text-completion"}
{processor="embeddings"}
# Error logs from a specific processor
{processor="config-svc", severity="ERROR"}
# Error logs from all processors
{severity="ERROR"}
# Logs from a specific processor with text filter
{processor="text-completion"} |= "Processing"
# All logs from API gateway
{processor="api-gateway"}
# Logs from processors matching pattern
{processor=~".*-completion"}
# Logs with custom tags
{processor="api-gateway"} | json | user_id="12345"
```
### Zarif Bozulma
Eğer Loki kullanılamıyorsa veya `python-logging-loki` yüklü değilse:
Uyarı mesajı konsola yazdırılır
Konsol kaydı normal şekilde devam eder
Uygulama çalışmaya devam eder
Loki bağlantısı için tekrar deneme mantığı yoktur (hızlı bir şekilde başarısız olun, zarif bir şekilde bozulun)
## Test
Testler sırasında, farklı bir kayıt yapılandırması kullanmayı düşünün:
```python
# In test setup
import logging
# Reduce noise during tests
logging.getLogger().setLevel(logging.WARNING)
# Or disable Loki for tests
setup_logging({'log_level': 'WARNING', 'loki_enabled': False})
```
## İzleme Entegrasyonu
### Standart Format
Tüm günlükler tutarlı bir formata sahiptir:
```
2025-01-09 10:30:45,123 - trustgraph.gateway.service - INFO - Request processed
```
Biçim öğeleri:
Zaman damgası (milisaniyelerle birlikte ISO formatı)
Kayıt yöneticisi adı (modül yolu)
Kayıt düzeyi
Mesaj
### İzleme için Loki Sorguları
Yaygın izleme sorguları:
```logql
# Error rate by processor
rate({severity="ERROR"}[5m]) by (processor)
# Top error-producing processors
topk(5, count_over_time({severity="ERROR"}[1h]) by (processor))
# Recent errors with processor name
{severity="ERROR"} | line_format "{{.processor}}: {{.message}}"
# All agent processors
{processor=~".*agent.*"} |= "exception"
# Specific processor error count
count_over_time({processor="config-svc", severity="ERROR"}[1h])
```
## Güvenlik Hususları
**Hassas bilgileri asla kaydetmeyin** (şifreler, API anahtarları, kişisel veriler, token'lar)
**Kayıt işleminden önce kullanıcı girişini temizleyin**
**Hassas alanlar için yer tutucular kullanın**: `user_id=****1234`
**Loki kimlik doğrulaması**: Güvenli dağıtımlar için `--loki-username` ve `--loki-password`'i kullanın
**Güvenli taşıma**: Üretimde Loki URL'si için HTTPS kullanın: `https://loki.prod:3100/loki/api/v1/push`
## Bağımlılıklar
Merkezi günlük kaydı modülü şunları gerektirir:
`python-logging-loki` - Loki entegrasyonu için (isteğe bağlı, eksikse sorunsuz bir şekilde çalışır)
Zaten `trustgraph-base/pyproject.toml` ve `requirements.txt` içinde bulunmaktadır.
## Geçiş Yolu
Mevcut kod için:
1. **AsyncProcessor kullanan hizmetler**: Herhangi bir değişiklik gerekmez, Loki desteği otomatik olarak sağlanır
2. **AsyncProcessor kullanmayan hizmetler** (api-gateway, mcp-server): Zaten güncellenmiştir
3. **CLI araçları**: Kapsam dışındadır - print() veya basit günlük kaydını kullanmaya devam edin
### print()'ten günlük kaydına:
```python
# Before
print(f"Processing document {doc_id}")
# After
logger = logging.getLogger(__name__)
logger.info(f"Processing document {doc_id}")
```
## Yapılandırma Özeti
| Argüman | Varsayılan Değer | Ortam Değişkeni | Açıklama |
|----------|---------|---------------------|-------------|
| `--log-level` | `INFO` | - | Konsol ve Loki log seviyesi |
| `--loki-enabled` | `True` | - | Loki log kaydını etkinleştir |
| `--loki-url` | `http://loki:3100/loki/api/v1/push` | `LOKI_URL` | Loki push endpoint'i |
| `--loki-username` | `None` | `LOKI_USERNAME` | Loki kimlik doğrulama kullanıcı adı |
| `--loki-password` | `None` | `LOKI_PASSWORD` | Loki kimlik doğrulama parolası |