trustgraph/docs/tech-specs/logging-strategy.he.md
Alex Jenkins 8954fa3ad7 Feat: TrustGraph i18n & Documentation Translation Updates (#781)
Native CLI i18n: The TrustGraph CLI has built-in translation support
that dynamically loads language strings. You can test and use
different languages by simply passing the --lang flag (e.g., --lang
es for Spanish, --lang ru for Russian) or by configuring your
environment's LANG variable.

Automated Docs Translations: This PR introduces autonomously
translated Markdown documentation into several target languages,
including Spanish, Swahili, Portuguese, Turkish, Hindi, Hebrew,
Arabic, Simplified Chinese, and Russian.
2026-04-14 12:08:32 +01:00

358 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
layout: default
title: "אסטרטגיית רישום (לוגינג) של TrustGraph"
parent: "Hebrew (Beta)"
---
# אסטרטגיית רישום (לוגינג) של TrustGraph
> **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.
## סקירה כללית
TrustGraph משתמש במודול `logging` המובנה של Python עבור כל פעולות הרישום, עם תצורה מרכזית ושילוב אופציונלי של Loki לאיסוף יומנים. זה מספק גישה סטנדרטית וגמישה לרישום בכל רכיבי המערכת.
## תצורה ברירת מחדל
### רמת רישום
**רמה ברירת מחדל**: `INFO`
**ניתן להגדרה באמצעות**: ארגומנט שורת הפקודה `--log-level`
**אפשרויות**: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`
### יעדי פלט
1. **קונסולה (stdout)**: תמיד מופעלת - מבטיחה תאימות עם סביבות מבוססות קונטיינרים
2. **Loki**: איסוף יומנים מרכזי אופציונלי (מופעל כברירת מחדל, ניתן לביטול)
## מודול רישום מרכזי
כל תצורת הרישום מנוהלת על ידי המודול `trustgraph.base.logging`, המספק:
`add_logging_args(parser)` - מוסיף ארגומנטי שורת פקודה סטנדרטיים לרישום
`setup_logging(args)` - מגדיר רישום מארגומנטים מנותחים
מודול זה משמש את כל רכיבי הצד-שרת:
שירותים מבוססי AsyncProcessor
API Gateway
MCP Server
## הנחיות יישום
### 1. אתחול רשומות
כל מודול צריך ליצור את הרשומות שלו באמצעות המודול `__name__`:
```python
import logging
logger = logging.getLogger(__name__)
```
שם ה-logger משמש באופן אוטומטי כתווית ב-Loki לצורך סינון וחיפוש.
### 2. אתחול שירות
כל השירותים בצד השרת מקבלים באופן אוטומטי הגדרות רישום דרך המודול המרכזי:
```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. ארגומנטים של שורת הפקודה
כל השירותים תומכים בארגומנטים אלה של רישום:
**רמת רישום:**
```bash
--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
```
**תצורת לוקי:**
```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
```
**דוגמאות:**
```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. משתני סביבה
תצורת Loki תומכת באפשרויות ברירת מחדל עבור משתני סביבה:
```bash
export LOKI_URL=http://loki.prod:3100/loki/api/v1/push
export LOKI_USERNAME=admin
export LOKI_PASSWORD=secret
```
ארגומנטים משורת הפקודה גוברים על משתני סביבה.
### 5. שיטות עבודה מומלצות לרישום נתונים
#### שימוש ברמות רישום
**DEBUG**: מידע מפורט לצורך אבחון בעיות (ערכי משתנים, כניסה/יציאה מפונקציות)
**INFO**: הודעות מידע כלליות (השירות התחיל, תצורה נטענה, נקודות ציון בעיבוד)
**WARNING**: הודעות אזהרה למצבים שעלולים להיות מזיקים (תכונות מיושנות, שגיאות שניתן להתאושש מהן)
**ERROR**: הודעות שגיאה לבעיות חמורות (פעולות שנכשלו, חריגות)
**CRITICAL**: הודעות קריטיות לכשלים במערכת הדורשים התייחסות מיידית
#### פורמט ההודעה
```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")
```
#### שיקולי ביצועים
```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. רישום מובנה עם לוקי
עבור נתונים מורכבים, השתמש ברישום מובנה עם תגיות נוספות עבור לוקי:
```python
logger.info("Request processed", extra={
'tags': {
'request_id': request_id,
'user_id': user_id,
'status': 'success'
}
})
```
תגיות אלו הופכות לתויות הניתנות לחיפוש ב-Loki, בנוסף לתויות אוטומטיות:
`severity` - רמת לוג (DEBUG, INFO, WARNING, ERROR, CRITICAL)
`logger` - שם מודול (מתוך `__name__`)
### 7. רישום חריגות
תמיד כללו עקבות מחסנית עבור חריגות:
```python
try:
process_data()
except Exception as e:
logger.error(f"Failed to process data: {e}", exc_info=True)
raise
```
### 8. שיקולים בנושא רישום אסינכרוני
מערכת הרישום משתמשת במטפלים (handlers) בתור לא חוסמים עבור Loki:
פלט לקונסולה הוא סינכרוני (מהיר)
פלט ל-Loki מוצג בתור עם מאגר של 500 הודעות
ניתוב רקע מטפל בהעברת נתונים ל-Loki
אין חסימה של קוד האפליקציה הראשי
```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()}")
```
## אינטגרציה עם לוקי
### ארכיטקטורה
מערכת הרישום משתמשת בפונקציות המובנות של Python, `QueueHandler` ו-`QueueListener`, עבור אינטגרציה לא חוסמת עם לוקי:
1. **QueueHandler**: הודעות רישום מוכנסות לתור של 500 הודעות (לא חוסם).
2. **Background Thread**: QueueListener שולח הודעות רישום ללוקי באופן אסינכרוני.
3. **Graceful Degradation**: אם לוקי אינו זמין, רישום לקונסולה ממשיך.
### תגיות אוטומטיות
כל הודעת רישום שנשלחת ללוקי כוללת:
`processor`: זהות המעבד (לדוגמה, `config-svc`, `text-completion`, `embeddings`).
`severity`: רמת הרישום (DEBUG, INFO, וכו').
`logger`: שם המודול (לדוגמה, `trustgraph.gateway.service`, `trustgraph.agent.react.service`).
### תגיות מותאמות אישית
הוספת תגיות מותאמות אישית באמצעות הפרמטר `extra`:
```python
logger.info("User action", extra={
'tags': {
'user_id': user_id,
'action': 'document_upload',
'collection': collection_name
}
})
```
### שאילתת יומנים ב-Loki
```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"
```
### ניוון מבוקר (Graceful Degradation)
אם Loki אינו זמין או `python-logging-loki` אינו מותקן:
הודעת אזהרה מוצגת לקונסולה
רישום לקונסולה ממשיך כרגיל
היישום ממשיך לפעול
אין לוגיקה של ניסיון חוזר לחיבור ל-Loki (כשל מהיר, ניוון מבוקר)
## בדיקות (Testing)
במהלך הבדיקות, שקלו להשתמש בתצורת רישום שונה:
```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})
```
## אינטגרציה של ניטור
### פורמט סטנדרטי
כל הרישומים משתמשים בפורמט עקבי:
```
2025-01-09 10:30:45,123 - trustgraph.gateway.service - INFO - Request processed
```
מרכיבי פורמט:
חותמת זמן (פורמט ISO עם מילישניות)
שם הלוגר (נתיב מודול)
רמת לוג
הודעה
### שאילתות לוקי לניטור
שאילתות ניטור נפוצות:
```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])
```
## שיקולי אבטחה
**לעולם אין לרשום מידע רגיש** (סיסמאות, מפתחות API, נתונים אישיים, טוקנים)
**לנקות קלט משתמש** לפני רישום
**להשתמש במחזירי מקום** עבור שדות רגישים: `user_id=****1234`
**אימות לוקי:** השתמשו ב-`--loki-username` ו-`--loki-password` עבור פריסות מאובטחות
**העברה מאובטחת:** השתמשו ב-HTTPS עבור כתובת ה-URL של לוקי בסביבת ייצור: `https://loki.prod:3100/loki/api/v1/push`
## תלויות
מודול הרישום המרכזי דורש:
`python-logging-loki` - עבור אינטגרציה עם לוקי (אופציונלי, ירידה הדרגתית אם חסר)
כלול כבר ב-`trustgraph-base/pyproject.toml` ו-`requirements.txt`.
## נתיב מעבר
עבור קוד קיים:
1. **שירותים שכבר משתמשים ב-AsyncProcessor:** אין צורך בשינויים, תמיכה בלוקי היא אוטומטית
2. **שירותים שאינם משתמשים ב-AsyncProcessor** (api-gateway, mcp-server): כבר עודכנו
3. **כלי שורת פקודה:** מחוץ לתחום - המשיכו להשתמש ב-print() או ברישום פשוט
### מ-print() לרישום:
```python
# Before
print(f"Processing document {doc_id}")
# After
logger = logging.getLogger(__name__)
logger.info(f"Processing document {doc_id}")
```
## סיכום הגדרות
| ארגומנט | ברירת מחדל | משתנה סביבה | תיאור |
|----------|---------|---------------------|-------------|
| `--log-level` | `INFO` | - | רמת רישום עבור קונסולה ו-Loki |
| `--loki-enabled` | `True` | - | הפעלת רישום Loki |
| `--loki-url` | `http://loki:3100/loki/api/v1/push` | `LOKI_URL` | נקודת קצה (endpoint) של Loki לשליחה |
| `--loki-username` | `None` | `LOKI_USERNAME` | שם משתמש לאימות ב-Loki |
| `--loki-password` | `None` | `LOKI_PASSWORD` | סיסמה לאימות ב-Loki |