Aracılığıyla paylaş


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:

  1. İstenen kitaplık için günlük nesnesini alın ve günlük düzeyini ayarlayın.
  2. Günlük akışı için bir işleyici kaydedin.
  3. 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 olarak logging.DEBUGayarlar.
  • 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.eventhubsbir günlükçü sağlar, azure-storage-queue kitaplığı adlı azure.storage.queuebir 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üğü. HATA Uygulamanın kurtarılma olasılığının düşük olduğu hatalar (bellek yetersizliği gibi).
Günlüğü. 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üğü. 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üğü. 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:

  1. Depo klasöründe sdk klasörüne gidin, ardından ilgili hizmet için klasörüne gidin.

  2. 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 Veri Katkıda Bulunanı" rolü atandığından emin olun. Daha fazla bilgi edinmek için bkz . Kimlik doğrulaması ile blob depolamayı kullanma.