mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-04-25 08:26:21 +02:00
359 lines
11 KiB
Markdown
359 lines
11 KiB
Markdown
|
|
---
|
|||
|
|
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ı |
|