Dağıtık bir sistemde bir istek başarısız olduğunda, hizmetler arasındaki ilgili günlükleri bulmak bir ilişkilendirme anahtarı olmadan zordur. Application Real-Time Monitoring Service (ARMS), OpenTelemetry izlem bağlamını — izleme kimliği, span kimliği ve hizmet adı — Python günlük kayıtlarına ekleyerek bu sorunu çözer. Daha sonra kök nedeni belirlemek için Simple Log Service (SLS) içindeki günlükleri izleme kimliğine göre arayabilirsiniz.
Nasıl çalışır: ARMS Python aracı, Python'un standart logging modülüne bağlanır ve her bir LogRecord öğesine izlem bağlamı alanları ekler. Aracı yalnızca ekleme işlemini yönetir; günlükleri toplamaz veya iletmez. Ayrı bir günlük toplama işlem hattı (genellikle SLS) günlük teslimatını sağlar.
Yalnızca Python standart logging modülü, OTEL_PYTHON_LOG_CORRELATION ortam değişkeni aracılığıyla otomatik izlem bağlamı eklemeyi destekler. Structlog ve diğer üçüncü taraf çerçeveler otomatik eklemeyi desteklemez.
Hızlı başlangıç
Üç ortam değişkenini ayarlayın ve uygulamanızı yeniden başlatın:
export OTEL_PYTHON_LOG_CORRELATION=true
export OTEL_PYTHON_LOG_LEVEL=info
export OTEL_PYTHON_LOG_FORMAT='%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] [trace_id=%(otelTraceID)s span_id=%(otelSpanID)s resource.service.name=%(otelServiceName)s trace_sampled=%(otelTraceSampled)s] - %(message)s'
Uygulama yeniden başlatıldıktan sonra, izlenen bir istek kapsamında oluşturulan her günlük satırı izlem bağlamını içerir:
2026-03-10 14:30:00,123 INFO [my_app] [app.py:42] [trace_id=ac1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6 span_id=1a2b3c4d5e6f7a8b resource.service.name=my-python-app trace_sampled=True] - Order created successfully
SLS bağlama ve doğrulama dahil olmak üzere tam kurulum için aşağıdaki bölümlere devam edin.
Ön koşullar
ARMS tarafından izlenen bir Python uygulaması. Bkz. Python uygulamalarını izleme.
Uygulama günlüklerinin SLS üzerinden toplanması. Bkz. Veri toplama genel bakış.
SLS'yi ARMS'e bağlama
Konsolun izlemeleri günlüklerle ilişkilendirebilmesi için SLS projenizi ve Logstore'unuzu ARMS'e bağlayın.
ARMS konsoluna oturum açın.
Sol gezinme bölmesinde seçeneğini tıklayın.
-
Üst gezinme çubuğundan bir bölge seçin ve uygulamanızı tıklayın.
NotLanguage sütunundaki simgeler programlama dilini gösterir: -
: Java -
: Go -
: Python - - (Tire): Managed Service for OpenTelemetry'de izlenen bir uygulama Üst gezinme çubuğunda Configuration > Custom Configurations seçeneğini seçin.
Application log Association configuration bölümünde, Log Source değerini Log service SLS olarak ayarlayın. SLS'nin dağıtıldığı bölgeyi seçin ve bir proje ile bir Logstore bağlayın.
İzlem-günlük ilişkilendirmesini etkinleştirme
İzlem bağlamı eklemeyi etkinleştirmek ve günlük biçimini tanımlamak için üç ortam değişkenini yapılandırın.
Ortam değişkenleri
| Değişken | Amaç | Varsayılan |
|---|---|---|
OTEL_PYTHON_LOG_CORRELATION |
İzlem-günlük ilişkilendirmesini etkinleştirir veya devre dışı bırakır. Etkinleştirmek için true olarak ayarlayın. false olarak ayarlanırsa veya boş bırakılırsa ilişkilendirme devre dışı kalır. |
false |
OTEL_PYTHON_LOG_LEVEL |
İlişkilendirme için minimum günlük düzeyi. Geçerli değerler: debug, info, warning, error. |
- |
OTEL_PYTHON_LOG_FORMAT |
Günlük çıktısı için biçim dizesi. Değeri iş gereksinimlerinize göre özelleştirebilirsiniz. Günlük çıktısına izlem bağlamını dahil etmek için aşağıda listelenen izlem bağlamı alanlarını kullanın. | - |
İzlem bağlamı alanları
Günlük çıktısına izlem bağlamını dahil etmek için OTEL_PYTHON_LOG_FORMAT biçim dizesinde şu alanları kullanın:
| Alan | Açıklama |
|---|---|
%(otelTraceID)s |
Günlüğü dağıtık bir izlemeden bağlayan izleme kimliği |
%(otelSpanID)s |
Mevcut günlük tarafından oluşturulan span kimliği |
%(otelTraceSampled)s |
İzlemenin örnekleme yapılıp yapılmadığı (True veya False) |
%(otelServiceName)s |
ARMS'e kaydedilen uygulama adı |
Ortam değişkenlerini ayarlama
Uygulamanızı başlatmadan önce aşağıdaki ortam değişkenlerini ayarlayın:
export OTEL_PYTHON_LOG_CORRELATION=true
export OTEL_PYTHON_LOG_LEVEL=info
export OTEL_PYTHON_LOG_FORMAT='%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] [trace_id=%(otelTraceID)s span_id=%(otelSpanID)s resource.service.name=%(otelServiceName)s trace_sampled=%(otelTraceSampled)s] - %(message)s'
Uygulama başladıktan sonra günlük çıktısı izlem bağlamını içerir:
Submitting thread
INFO: Started server process [271]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
2025-01-02 21:55:31,142 WARNING [__main__] [app.py:14] [trace_id=534xxx021eb span_id=15xxx32 resource.service.name=fastapi-agent-manual trace_sampled=True] - calling client
INFO: 127.0.0.1:59956 - "GET / HTTP/1.1" 200 OK
Özel işleyicilere izlem bağlamı ekleme
İzlem bağlamı yalnızca kök logger'a otomatik olarak eklenir. Özel işleyiciler kullanıyorsanız, biçimlendiricilerini OTEL_PYTHON_LOG_FORMAT ortam değişkeninden okuyacak şekilde ayarlayın:
import os
import logging
# Read the format string from the environment variable
log_format = os.getenv('OTEL_PYTHON_LOG_FORMAT')
# Create a custom handler with trace context fields
my_handler = logging.StreamHandler()
formatter = logging.Formatter(log_format)
my_handler.setFormatter(formatter)
# Attach the handler to a logger
logger = logging.getLogger('my_module')
logger.addHandler(my_handler)
logger.setLevel(logging.INFO)
structlog'a izlem bağlamı ekleme
Uygulamanız structlog kullanıyorsa otomatik izlem bağlamı eklemesi desteklenmez. OpenTelemetry SDK'sından izlem bağlamını okuyan özel bir işlemciyi structlog işlem hattınıza ekleyin:
from opentelemetry import trace
import structlog
def add_otel_context(logger, method, event_dict):
span = trace.get_current_span()
ctx = span.get_span_context()
if ctx.is_valid:
event_dict['trace_id'] = format(ctx.trace_id, '032x')
event_dict['span_id'] = format(ctx.span_id, '016x')
return event_dict
structlog.configure(
processors=[
add_otel_context,
structlog.processors.JSONRenderer(),
]
)
Yapılandırmadan sonra, izlenen bir istek kapsamında oluşturulan her structlog girişi trace_id ve span_id alanlarını içerir. SLS, günlüğü ilgili dağıtık izlemden ilişkilendirmek için bu alanları kullanır.
Günlük toplamayı yapılandırma (isteğe bağlı)
ARMS Python aracı yalnızca izlem bağlamı alanlarını günlük kayıtlarına eklemekle sorumludur. Uygulama günlüklerini toplamaz veya iletmez. Uygulama günlükleriniz doğrudan SLS tarafından toplanır; OpenTelemetry konsoluna ek raporlama gerekmez.
İlişkilendirilmiş günlükleri ARMS konsolunda görüntülemek için, uygulamanızdan günlükleri toplayıp SLS'yi ARMS'e bağlama bölümünde bağladığınız SLS projesine ve Logstore'a iletecek şekilde SLS'yi yapılandırın.
SLS günlük toplama hakkında daha fazla bilgi için bkz. Veri toplama genel bakış.
Yapılandırmayı doğrulama
Uygulamanıza bir test isteği gönderin.
-
Uygulama günlük çıktısını kontrol edin. İzlenen bir istek kapsamında oluşturulan her günlük satırı sıfır olmayan bir
trace_iddeğeri içerir:2026-03-10 14:30:00,123 INFO [my_app] [app.py:42] [trace_id=ac1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6 span_id=1a2b3c4d5e6f7a8b resource.service.name=my-python-app trace_sampled=True] - Order created successfully ARMS konsolunda, istek için izlem ayrıntıları sayfasını açın ve ilişkili günlüklerin doğru izleme kimliğini görüntülediğini onaylayın.