Python için Azure kitaplıklarında günlüğe kaydetmeyi yapılandırma
Azure.core tabanlı Python için Azure Kitaplıkları, standart Python günlük kitaplığını kullanarak günlük çıkışı sağlar.
Günlüğe kaydetmeyle çalışmak için genel süreç aşağıdaki gibidir:
- İstenen kitaplık için günlük nesnesini alın ve günlük düzeyini ayarlayın.
- Günlük akışı için bir işleyici kaydedin.
- HTTP bilgilerini eklemek için bir
logging_enable=True
parametreyi istemci nesne oluşturucusna, kimlik bilgisi nesne oluşturucusna veya belirli bir yönteme geçirin.
Ayrıntılar bu makalenin kalan bölümlerinde verilmiştir.
Genel bir kural olarak, kitaplıklar içindeki günlük kullanımını anlamak için en iyi kaynak github.com/Azure/azure-sdk-for-python SDK kaynak koduna göz atmaktır. Aşağıdaki bölümlerde de belirtildiği gibi, gerektiğinde ayrıntıları kolayca arayabilmeniz için bu depoyu yerel olarak kopyalamanızı öneririz.
Günlük düzeylerini ayarlama
import logging
# ...
# Acquire the logger for a library (azure.mgmt.resource in this example)
logger = logging.getLogger('azure.mgmt.resource')
# Set the desired logging level
logger.setLevel(logging.DEBUG)
- Bu örnek, kitaplık için günlükçü alır
azure.mgmt.resource
ve günlüğe kaydetme düzeyini olaraklogging.DEBUG
ayarlar. - Farklı kod kesimlerinin günlük düzeyini değiştirmek için istediğiniz zaman çağırabilirsiniz
logger.setLevel
.
Farklı bir kitaplığın düzeyini ayarlamak için çağrıda bu kitaplığın logging.getLogger
adını kullanın. Örneğin, azure-eventhubs kitaplığı adlı azure.eventhubs
bir günlükçü sağlar, azure-storage-queue kitaplığı adlı azure.storage.queue
bir günlükçü sağlar ve bu şekilde devam eder. (SDK kaynak kodu genellikle içeren modülün adını kullanarak günlükçü alan deyimini logging.getLogger(__name__)
kullanır.)
Daha genel ad alanları da kullanabilirsiniz. Örneğin,
import logging
# Set the logging level for all azure-storage-* libraries
logger = logging.getLogger('azure.storage')
logger.setLevel(logging.INFO)
# Set the logging level for all azure-* libraries
logger = logging.getLogger('azure')
logger.setLevel(logging.ERROR)
Günlükçü azure
belirli bir günlükçü yerine bazı kitaplıklar tarafından kullanılır. Örneğin, azure-storage-blob kitaplığı günlükçü kullanır azure
.
Belirli bir günlük düzeyinin logger.isEnabledFor
etkinleştirilip etkinleştirilmediğini denetlemek için yöntemini kullanabilirsiniz:
print(
f"Logger enabled for ERROR={logger.isEnabledFor(logging.ERROR)}, "
f"WARNING={logger.isEnabledFor(logging.WARNING)}, "
f"INFO={logger.isEnabledFor(logging.INFO)}, "
f"DEBUG={logger.isEnabledFor(logging.DEBUG)}"
)
Günlük düzeyleri, standart günlük kitaplığı düzeyleriyle aynıdır. Aşağıdaki tabloda Python için Azure kitaplıklarında bu günlük düzeylerinin genel kullanımı açıklanmaktadır:
Günlük düzeyi | Tipik kullanım |
---|---|
günlük tutmak. HATA | Uygulamanın kurtarılma olasılığının düşük olduğu hatalar (bellek yetersizliği gibi). |
günlük tutmak. UYARI (varsayılan) | İşlev hedeflenen görevini gerçekleştiremez (ancak REST API çağrısını yeniden deneme gibi işlev kurtarılabildiği zaman gerçekleştiremez). İşlevler genellikle özel durumlar oluştururken bir uyarı kaydeder. Uyarı düzeyi, hata düzeyini otomatik olarak etkinleştirir. |
logging.INFO | İşlev normal çalışır veya bir hizmet çağrısı iptal edilir. Bilgi olayları genellikle istekleri, yanıtları ve üst bilgileri içerir. Bilgi düzeyi hata ve uyarı düzeylerini otomatik olarak etkinleştirir. |
günlük tutmak. HATA AYIKLAMA | Sorun giderme için yaygın olarak kullanılan ve özel durumlar için yığın izlemesi içeren ayrıntılı bilgiler. Hata ayıklama düzeyi, bilgi, uyarı ve hata düzeylerini otomatik olarak etkinleştirir. DİkKAT: ayrıca ayarlarsanız logging_enable=True , hata ayıklama düzeyi üst bilgilerdeki hesap anahtarları ve diğer kimlik bilgileri gibi hassas bilgileri içerir. Güvenliğin tehlikeye atılmasını önlemek için bu günlükleri koruduğunızdan emin olun. |
günlük tutmak. NOTSET | Tüm günlükleri devre dışı bırakın. |
Kitaplığa özgü günlük düzeyi davranışı
Her düzeydeki tam günlük davranışı, söz konusu kitaplığa bağlıdır. Azure.eventhub gibi bazı kitaplıklar kapsamlı günlük kaydı gerçekleştirirken, diğer kitaplıklar çok az şey yapar.
Bir kitaplığın tam günlüğünü incelemenin en iyi yolu, Python kaynak kodu için Azure SDK'sında günlük düzeylerini aramaktır:
Depo klasöründe sdk klasörüne gidin, ardından ilgili hizmet için klasörüne gidin.
Bu klasörde aşağıdaki dizelerden herhangi birini arayın:
_LOGGER.error
_LOGGER.warning
_LOGGER.info
_LOGGER.debug
Günlük akışı işleyicisini kaydetme
Günlük çıkışını yakalamak için kodunuzda en az bir günlük akışı işleyicisi kaydetmeniz gerekir:
import logging
# Direct logging output to stdout. Without adding a handler,
# no logging output is visible.
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)
Bu örnek, günlük çıkışını stdout'a yönlendiren bir işleyici kaydeder. Python belgelerinde logging.handlers dosyasında açıklandığı gibi diğer işleyici türlerini kullanabilir veya standard logging.basicConfig yöntemini kullanabilirsiniz.
İstemci nesnesi veya işlemi için HTTP günlüğünü etkinleştirme
Varsayılan olarak, Azure kitaplıkları içinde günlüğe kaydetme işlemi herhangi bir HTTP bilgisi içermez. HTTP bilgilerini günlük çıkışına eklemek için (HATA AYıKLAMA düzeyi olarak), açıkça bir istemciye veya kimlik bilgisi nesnesi oluşturucusna veya belirli bir yönteme geçirmeniz logging_enable=True
gerekir.
Dikkat
HTTP günlüğü, üst bilgilerdeki hesap anahtarları ve diğer kimlik bilgileri gibi hassas bilgileri içerebilir. Güvenliğin tehlikeye atılmasını önlemek için bu günlükleri koruduğunızdan emin olun.
İstemci nesnesi için HTTP günlüğünü etkinleştirme (HATA AYıKLAMA düzeyi)
from azure.storage.blob import BlobClient
from azure.identity import DefaultAzureCredential
# Enable HTTP logging on the client object when using DEBUG level
# endpoint is the Blob storage URL.
client = BlobClient(endpoint, DefaultAzureCredential(), logging_enable=True)
İstemci nesnesi için HTTP günlüğünün etkinleştirilmesi, bu nesne aracılığıyla çağrılan tüm işlemler için günlüğe kaydetmeyi etkinleştirir.
Kimlik bilgisi nesnesi için HTTP günlüğünü etkinleştirme (HATA AYıKLAMA düzeyi)
from azure.storage.blob import BlobClient
from azure.identity import DefaultAzureCredential
# Enable HTTP logging on the credential object when using DEBUG level
credential = DefaultAzureCredential(logging_enable=True)
# endpoint is the Blob storage URL.
client = BlobClient(endpoint, credential)
Kimlik bilgisi nesnesi için HTTP günlüğünün etkinleştirilmesi, bu nesne aracılığıyla çağrılan tüm işlemler için günlüğe kaydetmeyi etkinleştirir, ancak kimlik doğrulaması içermeyen bir istemci nesnesindeki işlemler için günlüğe kaydetmeyi etkinleştirmez.
Tek bir yöntem için günlüğe kaydetmeyi etkinleştirme (HATA AYıKLAMA düzeyi)
from azure.storage.blob import BlobClient
from azure.identity import DefaultAzureCredential
# endpoint is the Blob storage URL.
client = BlobClient(endpoint, DefaultAzureCredential())
# Enable HTTP logging for only this operation when using DEBUG level
client.create_container("container01", logging_enable=True)
Örnek günlük çıkışı
Aşağıdaki kod Örnek'te gösterilen koddur: DEBUG ve HTTP günlüğünü etkinleştirmenin yanı sıra bir depolama hesabı kullanın:
import logging
import os
import sys
import uuid
from azure.core import exceptions
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobClient
logger = logging.getLogger("azure")
logger.setLevel(logging.DEBUG)
# Set the logging level for the azure.storage.blob library
logger = logging.getLogger("azure.storage.blob")
logger.setLevel(logging.DEBUG)
# Direct logging output to stdout. Without adding a handler,
# no logging output is visible.
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)
print(
f"Logger enabled for ERROR={logger.isEnabledFor(logging.ERROR)}, "
f"WARNING={logger.isEnabledFor(logging.WARNING)}, "
f"INFO={logger.isEnabledFor(logging.INFO)}, "
f"DEBUG={logger.isEnabledFor(logging.DEBUG)}"
)
try:
credential = DefaultAzureCredential()
storage_url = os.environ["AZURE_STORAGE_BLOB_URL"]
unique_str = str(uuid.uuid4())[0:5]
# Enable logging on the client object
blob_client = BlobClient(
storage_url,
container_name="blob-container-01",
blob_name=f"sample-blob-{unique_str}.txt",
credential=credential,
)
with open("./sample-source.txt", "rb") as data:
blob_client.upload_blob(data, logging_body=True, logging_enable=True)
except (
exceptions.ClientAuthenticationError,
exceptions.HttpResponseError
) as e:
print(e.message)
Çıktı aşağıdaki şekilde olacaktır:
Logger enabled for ERROR=True, WARNING=True, INFO=True, DEBUG=True
Request URL: 'https://pythonazurestorage12345.blob.core.windows.net/blob-container-01/sample-blob-5588e.txt'
Request method: 'PUT'
Request headers:
'Content-Length': '77'
'x-ms-blob-type': 'BlockBlob'
'If-None-Match': '*'
'x-ms-version': '2023-11-03'
'Content-Type': 'application/octet-stream'
'Accept': 'application/xml'
'User-Agent': 'azsdk-python-storage-blob/12.19.0 Python/3.10.11 (Windows-10-10.0.22631-SP0)'
'x-ms-date': 'Fri, 19 Jan 2024 19:25:53 GMT'
'x-ms-client-request-id': '8f7b1b0b-b700-11ee-b391-782b46f5c56b'
'Authorization': '*****'
Request body:
b"Hello there, Azure Storage. I'm a friendly file ready to be stored in a blob."
Response status: 201
Response headers:
'Content-Length': '0'
'Content-MD5': 'SUytm0872jZh+KYqtgjbTA=='
'Last-Modified': 'Fri, 19 Jan 2024 19:25:54 GMT'
'ETag': '"0x8DC1924749AE3C3"'
'Server': 'Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0'
'x-ms-request-id': '7ac499fa-601e-006d-3f0d-4bdf28000000'
'x-ms-client-request-id': '8f7b1b0b-b700-11ee-b391-782b46f5c56b'
'x-ms-version': '2023-11-03'
'x-ms-content-crc64': 'rtHLUlztgxc='
'x-ms-request-server-encrypted': 'true'
'Date': 'Fri, 19 Jan 2024 19:25:53 GMT'
Response content:
b''
Not
Yetkilendirme hatası alırsanız, altında çalıştırdığınız kimliğe blob kapsayıcınızda "Depolama Blob Verileri Katkıda Bulunanı" rolünün atandığından emin olun. Daha fazla bilgi edinmek için bkz . Uygulama kodundan blob depolama kullanma (Parolasız sekmesi).