Azure Monitor를 사용하여 가상 머신에서 JSON 파일 수집

많은 애플리케이션 및 서비스는 Windows 이벤트 로그 또는 Syslog와 같은 표준 로깅 서비스 대신 텍스트 파일에 정보를 기록합니다. 이 데이터가 JSON 형식으로 저장되면 Azure Monitor에서 사용자 지정 JSON 로그 데이터 원본을 사용하여 DCR(데이터 수집 규칙)에서 수집할 수 있습니다.

DCR 만들기에 대한 세부 정보는 Azure Monitor 에이전트를 사용하여 데이터 수집에 제공됩니다. 이 문서에서는 JSON 로그 유형에 대한 자세한 내용을 제공합니다.

비고

DCR 정의를 직접 사용하거나 ARM 템플릿과 같은 다른 방법으로 배포하려면 Azure Monitor의 DCR(데이터 수집 규칙) 샘플을 참조하세요.

필수 조건

Azure Monitor를 사용하여 가상 머신 클라이언트에서 데이터 수집에 나열된 필수 조건 외에도 데이터를 수신하려면 Log Analytics 작업 영역에 사용자 지정 테이블이 필요합니다. 이 테이블의 요구 사항에 대한 자세한 내용은 Log Analytics 작업 영역 테이블을 참조하세요.

사용자 지정 JSON 파일 데이터 원본 구성

Azure Monitor를 사용하여 가상 머신 클라이언트에서 데이터 수집 프로세스를 사용하여 DCR을 만듭니다. DCR의 수집 및 배달 탭의 데이터 원본 형식 드롭다운에서 사용자 지정 JSON 로그를 선택합니다.

JSON 파일 컬렉션의 구성을 보여 주는 스크린샷

사용자 지정 JSON 로그 구성에서 사용할 수 있는 옵션은 다음 표에 설명되어 있습니다.

설정 설명
파일 패턴 로컬 디스크에 있는 로그 파일의 위치와 이름을 식별합니다. 예를 들어, 매일 새 이름으로 새 파일이 만들어지는 경우와 같이 다양한 파일 이름에는 와일드카드를 사용합니다. 쉼표로 구분된 여러 파일 패턴을 입력할 수 있습니다. 파일 이름에 와일드카드(*)를 사용하고 파일 이름 위에 있는 첫 번째 수준 폴더 이름만 사용할 수 있습니다.

예제:
- C:\Logs\MyLog.json
- C:\Logs\MyLog*.json
-C:\Logs\IIS*\*.json
- C:\App01\AppLog.json, C:\App02\AppLog.json
- /var/mylog.json
- /var/mylog*.json
- /var/logs/*/*
테이블 이름 Log Analytics 작업 영역의 대상 테이블 이름입니다.
변화시키다 수집 시간 변환을 통해 레코드를 필터링하거나 대상 테이블에 대한 수신 데이터 서식을 지정합니다. 수신 데이터를 변경하지 않고 그대로 두려면 source를 사용합니다. 예제는 변환 을 참조하세요.
JSON 스키마 JSON 로그 파일에서 수집하여 대상 테이블로 보낼 속성입니다. 유일한 필수 속성은 .입니다 TimeGenerated. JSON 파일에서 이 값을 제공하지 않으면 수집 시간이 사용됩니다. 필요하지 않은 Log Analytics 작업 영역 테이블에 설명된 다른 열도 포함할 수 있으며 자동으로 채워집니다. 기타 속성은 동일한 이름의 열을 테이블에 채웁니다. 테이블 열과 일치하는 속성이 해당 열과 동일한 데이터 형식을 사용하는지 확인합니다.

이미지는 JSON 파일 요구 사항 및 모범 사례에 표시된 샘플 JSON 파일에 대한 JSON 스키마를 보여 줍니다.

대상 추가

사용자 지정 JSON 로그는 사용자가 만든 사용자 지정 테이블 의 스토리지에 대한 Log Analytics 작업 영역으로만 보낼 수 있습니다. Azure Monitor 로그 유형의 대상을 추가하고 Log Analytics 작업 영역을 선택합니다. 사용자 지정 JSON 로그 데이터 원본에 대한 단일 작업 영역만 DCR에 추가할 수 있습니다. 여러 대상이 필요한 경우 여러 DCR을 만듭니다. 중복 데이터를 각각에 보내고 추가 비용이 발생한다는 점에 유의하세요.

데이터 수집 규칙의 Azure Monitor 로그 대상 구성을 보여주는 스크린샷.

JSON 파일 요구 사항 및 모범 사례

Azure Monitor 에이전트가 수집하는 파일은 다음 요구 사항을 충족해야 합니다.

  • 이 파일은 모니터링 중인 디렉터리에 있는 에이전트 컴퓨터의 로컬 드라이브에 저장되어야 합니다.
  • 각 항목은 JSON의 단일 행이고 줄 끝으로 구분된 JSON 줄(예: JSONL 또는 NDJSON)이어야 합니다. 특히 중첩 및 JSON 본문 형식은 지원되지 않습니다. 아래 샘플을 참조하세요.
  • 파일은 ASCII 또는 UTF-8 인코딩을 사용해야 합니다. UTF-16과 같은 다른 형식은 지원되지 않습니다.
  • 새 레코드는 파일 끝에 추가되어야 하며 이전 레코드를 덮어쓰면 안 됩니다. 덮어쓰기를 사용하면 데이터가 손실됩니다.

다음은 Azure Monitor에서 수집할 수 있는 일반적인 JSON 로그 파일의 샘플입니다. 여기에는 다음과 같은 필드가 포함됩니다: Time, Code, Severity, Module, 그리고 Message.

{"Time":"2025-03-07 13:17:34","Code":1423,"Severity":"Error","Module":"Sales","Message":"Unable to connect to pricing service."}
{"Time":"2025-03-07 13:18:23","Code":1420,"Severity":"Information","Module":"Sales","Message":"Pricing service connection established."}
{"Time":"2025-03-07 15:45:13","Code":2011,"Severity":"Warning","Module":"Procurement","Message":"Module failed and was restarted."}
{"Time":"2025-03-07 15:53:31","Code":4100,"Severity":"Information","Module":"Data","Message":"Daily backup complete."}

데이터 손실이나 성능 문제가 발생하지 않도록 하려면 다음 권장 사항을 따릅니다.

  • 로그 파일이 있는 디렉터리를 10개 이상 대상으로 지정하지 마세요. 디렉터리를 너무 많이 폴링하면 성능이 저하됩니다.
  • 모니터링되는 디렉터리의 로그 파일을 지속적으로 정리합니다. 많은 로그 파일을 추적하면 에이전트 CPU 및 메모리 사용량이 증가할 수 있습니다. 모든 로그가 처리될 때까지 충분한 시간을 허용하기 위해 2일 이상 기다립니다.
  • 파일 검사 패턴과 일치하는 파일의 이름을 파일 검사 패턴과 일치하는 다른 이름으로 바꾸지 마세요. 이로 인해 중복 데이터가 수집됩니다.
  • 파일 검사 패턴과 일치하는 대용량 로그 파일의 이름을 바꾸거나 모니터링되는 디렉터리에 복사하지 마세요. 분당 50MB를 초과하지 않도록 하세요.

Log Analytics 작업 영역 테이블

에이전트는 지정된 이름 패턴과 일치하는 로컬 디스크의 json 파일을 감시합니다. 각 항목은 로그에 작성될 때 수집된 후, Log Analytics 작업 영역의 지정된 테이블로 전송되기 전 구문 분석됩니다. DCR을 만들기 전에 데이터를 수신하는 Log Analytics 작업 영역의 사용자 지정 테이블이 있어야 합니다.

구문 분석된 Json 데이터의 필드 이름과 일치하는 테이블의 모든 열은 로그 항목의 값으로 채워집니다. 다음 표에서는 JSON 데이터에서 식별된 열 외에도 작업 영역 테이블의 필수 및 선택적 열에 대해 설명합니다.

칼럼 유형 필수? 설명
TimeGenerated 날짜 및 시간 이 열에는 레코드가 생성된 시간이 포함되며 모든 테이블에 필요합니다. 이 값은 Log Analytics 작업 영역에 레코드가 추가되는 시간으로 자동으로 채워집니다. 변환을 사용하여 이 값을 재정의하고 로그 항목의 값을 TimeGenerated에 설정할 수 있습니다.
Computer 문자열 아니오 테이블에 이 열이 포함된 경우 로그 항목이 수집된 컴퓨터의 이름으로 채워집니다.
FilePath 문자열 아니오 테이블에 이 열이 포함된 경우 로그 항목이 수집된 로그 파일의 경로로 채워집니다.

다음 예제에서는 샘플 JSON 파일에 대해 만든 테이블에서 데이터를 반환하는 쿼리를 보여줍니다. 샘플 JSON 스키마와 함께 DCR을 사용하여 수집되었습니다. JSON 데이터에 대한 TimeGenerated속성이 포함되지 않으므로 수집 시간이 사용됩니다. ComputerFilePath 열도 자동으로 채워집니다.

수집된 JSON 로그의 결과를 반환하는 로그 쿼리를 보여 주는 스크린샷

사용자 지정 테이블 만들기

대상 테이블이 아직 없는 경우 DCR을 만들기 전에 만들어야 합니다. 아래 Powershell 스크립트만 사용하여 테이블을 만듭니다. 다른 메서드는 작동하지 않습니다. 예를 들어 다음 PowerShell 스크립트를 사용하여 샘플 JSON 파일에서 데이터를 수신하는 사용자 지정 테이블을 만들 수 있습니다. 이 예제에서는 선택적 열도 추가합니다.

$tableParams = @'
{
    "properties": {
        "schema": {
               "name": "{TableName}_CL",
               "columns": [
                    {
                        "name": "TimeGenerated",
                        "type": "dateTime"
                    }, 
                    {
                        "name": "Computer",
                        "type": "string"
                    },
                    {
                        "name": "FilePath",
                        "type": "string"
                    },
                    {
                        "name": "Time",
                        "type": "dateTime"
                    },
                    {
                        "name": "Code",
                        "type": "int"
                    },
                    {
                        "name": "Severity",
                        "type": "string"
                    },
                    {
                        "name": "Module",
                        "type": "string"
                    },
                    {
                        "name": "Message",
                        "type": "string"
                    }
              ]
        }
    }
}
'@

Invoke-AzRestMethod -Path "/subscriptions/{subscription}/resourcegroups/{resourcegroup}/providers/microsoft.operationalinsights/workspaces/{WorkspaceName}/tables/{TableName}_CL?api-version=2021-12-01-preview" -Method PUT -payload $tableParams

변형

변환은 레코드를 필터링하거나 스키마를 수정하여 대상 테이블과 일치하도록 수신 스트림을 잠재적으로 수정합니다. 수신 스트림의 스키마가 대상 테이블과 동일하면 source의 기본 변환을 사용할 수 있습니다. 그렇지 않은 경우, 필요한 스키마를 반환하는 KQL 쿼리를 사용하여 ARM 템플릿의 transformKql 섹션을 수정하십시오.

예를 들어 예제에서 로그 항목에는 Time 로그 항목이 만들어진 시간이 포함된 필드가 있습니다. 대상 테이블에 별도의 열로 저장하는 대신, Time 속성의 값을 다음 변환을 통해 TimeGenerated에 매핑할 수 있습니다.

source | extend TimeGenerated = todatetime(Time) | project-away Time

변환이 포함된 JSON 데이터 원본 구성을 보여 주는 스크린샷

그러면 다음 로그 쿼리가 발생합니다. Time 열이 비어 있으며, 해당 속성의 값은 TimeGenerated에 사용됩니다.

변환을 사용하여 수집된 JSON 로그의 결과를 반환하는 로그 쿼리를 보여 주는 스크린샷

문제 해결

예상한 JSON 로그에서 데이터를 수집하지 않는 경우 다음 단계를 수행합니다.

  • 수집 중인 로그 파일에 데이터가 기록되고 있는지 확인합니다.
  • 로그 파일의 이름과 위치가 지정한 파일 패턴과 일치하는지 확인합니다.
  • DCR의 수신 스트림 스키마가 로그 파일의 스키마와 일치하는지 확인합니다.
  • 대상 테이블의 스키마가 들어오는 스트림과 일치하는지 또는 들어오는 스트림을 올바른 스키마로 변환하는 변환이 있는지 확인합니다.
  • 에이전트가 작동 중이고 데이터가 수신되고 있는지 확인하려면 작동 확인을 참조하세요.

다음 단계