다음을 통해 공유


로그 수집 API를 사용하여 Azure Monitor로 데이터를 보내는 샘플 코드

이 문서에서는 로그 수집 API를 사용하는 샘플 코드를 제공합니다. 각 샘플에서는 코드를 실행하기 전에 다음 구성 요소를 만들어야 합니다. 이러한 각 샘플을 지원하도록 구성된 구성 요소를 만드는 전체 연습은 자습서: 로그 수집 API(Resource Manager 템플릿)를 사용하여 Azure Monitor에 데이터 보내기를 참조하세요.

  • Log Analytics 작업 영역의 사용자 지정 테이블
  • 데이터를 대상 테이블로 전달하는 DCR(데이터 수집 규칙)
  • DCR에 대한 액세스 권한이 있는 Microsoft Entra 애플리케이션
  • 프라이빗 링크를 사용하는 경우 DCE(데이터 수집 엔드포인트)입니다. 그렇지 않으면 DCR 로그 엔드포인트를 사용합니다.

샘플 코드

다음 스크립트는 .NET용 Azure Monitor 수집 클라이언트 라이브러리를 사용합니다.

  1. Azure Monitor 수집 클라이언트 라이브러리 및 Azure ID 라이브러리를 설치합니다. 이 샘플에서 사용되는 인증에는 Azure ID 라이브러리가 필요합니다.

    dotnet add package Azure.Identity
    dotnet add package Azure.Monitor.Ingestion
    
  2. Microsoft Entra 애플리케이션에 대한 값을 사용하여 다음 환경 변수를 만듭니다. 이러한 값은 Azure ID 라이브러리에서 DefaultAzureCredential에 의해 사용됩니다.

    • AZURE_TENANT_ID
    • AZURE_CLIENT_ID
    • AZURE_CLIENT_SECRET
  3. 다음 샘플 코드의 변수를 DCR의 값으로 바꿉니다. 샘플 데이터를 사용자 고유의 데이터로 바꿀 수도 있습니다.

    using Azure;
    using Azure.Core;
    using Azure.Identity;
    using Azure.Monitor.Ingestion;
    
    // Initialize variables
    var endpoint = new Uri("https://my-url.monitor.azure.com");
    var ruleId = "dcr-00000000000000000000000000000000";
    var streamName = "Custom-MyTableRawData";
    
    // Create credential and client
    var credential = new DefaultAzureCredential();
    LogsIngestionClient client = new(endpoint, credential);
    
    DateTimeOffset currentTime = DateTimeOffset.UtcNow;
    
    // Use BinaryData to serialize instances of an anonymous type into JSON
    BinaryData data = BinaryData.FromObjectAsJson(
        new[] {
            new
            {
                Time = currentTime,
                Computer = "Computer1",
                AdditionalContext = new
                {
                    InstanceName = "user1",
                    TimeZone = "Pacific Time",
                    Level = 4,
                    CounterName = "AppMetric1",
                    CounterValue = 15.3
                }
            },
            new
            {
                Time = currentTime,
                Computer = "Computer2",
                AdditionalContext = new
                {
                    InstanceName = "user2",
                    TimeZone = "Central Time",
                    Level = 3,
                    CounterName = "AppMetric1",
                    CounterValue = 23.5
                }
            },
        });
    
    // Upload logs
    try
    {
        var response = await client.UploadAsync(ruleId, streamName, RequestContent.Create(data)).ConfigureAwait(false);
        if (response.IsError)
        {
            throw new Exception(response.ToString());
        }
    
        Console.WriteLine("Log upload completed using content upload");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Upload failed with Exception: " + ex.Message);
    }
    
    // Logs can also be uploaded in a List
    var entries = new List<object>();
    for (int i = 0; i < 10; i++)
    {
        entries.Add(
            new
            {
                Time = currentTime,
                Computer = "Computer" + i.ToString(),
                AdditionalContext = new
                {
                    InstanceName = "user" + i.ToString(),
                    TimeZone = "Central Time",
                    Level = 3,
                    CounterName = "AppMetric1" + i.ToString(),
                    CounterValue = i
                }
            }
        );
    }
    
    // Make the request
    try
    {
        var response = await client.UploadAsync(ruleId, streamName, entries).ConfigureAwait(false);
        if (response.IsError)
        {
            throw new Exception(response.ToString());
        }
    
        Console.WriteLine("Log upload completed using list of entries");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Upload failed with Exception: " + ex.Message);
    }
    
  4. 코드를 실행하면 데이터가 몇 분 내에 Log Analytics 작업 영역에 도착합니다.

문제 해결

이 섹션에서는 나타날 수 있는 다양한 오류 조건과 이를 수정하는 방법에 대해 설명합니다.

스크립트가 오류 코드 403을 반환합니다.

DCR에 대한 애플리케이션에 대한 올바른 권한이 있는지 확인합니다. 권한이 전파될 때까지 최대 30분을 기다려야 할 수도 있습니다.

스크립트가 오류 코드 413 또는 TimeoutExpired 경고를 메시지 ReadyBody_ClientConnectionAbort와 함께 반환합니다.

메시지가 너무 큽니다. 최대 메시지 크기는 현재 호출당 1MB입니다.

스크립트가 오류 코드 429를 반환합니다.

API 한도를 초과했습니다. 현재 제한은 압축 및 비압축 데이터 모두에 대해 분당 500MB의 데이터와 분당 300,000개의 요청으로 설정되어 있습니다. 응답의 Retry-After 머리글에 나열된 기간 후에 다시 시도합니다.

스크립트가 오류 코드 503을 반환합니다.

DCR에 대한 애플리케이션에 대한 올바른 권한이 있는지 확인합니다. 권한이 전파될 때까지 최대 30분을 기다려야 할 수도 있습니다.

오류가 발생하지 않지만 작업 영역에 데이터가 표시되지 않습니다.

데이터를 수집하는 데 시간이 걸릴 수 있습니다. 특히 데이터가 특정 테이블에 처음 전송되는 경우 더 그럴 수 있습니다. 15분 이상 걸리지는 않습니다.

Log Analytics의 IntelliSense가 새 테이블을 인식하지 못합니다.

IntelliSense를 구동하는 캐시는 업데이트하는 데 최대 24시간이 걸릴 수 있습니다.

다음 단계