다음을 통해 공유


Azure Monitor 에이전트를 사용하여 JSON 파일에서 로그 수집

사용자 지정 JSON 로그DCR(데이터 수집 규칙)에 사용되는 데이터 원본 중 하나입니다. DCR 만들기에 대한 세부 정보는 Azure Monitor 에이전트를 사용하여 데이터 수집에 제공됩니다. 이 문서에서는 텍스트 및 JSON 로그 형식에 대한 추가 세부 정보를 제공합니다.

많은 애플리케이션과 서비스는 Windows 이벤트 로그 또는 Syslog와 같은 표준 로깅 서비스 대신 JSON 파일에 정보를 로깅합니다. 이 데이터는 Azure Monitor 에이전트를 통해 수집할 수 있으며 다른 원본에서 수집한 데이터와 함께 Log Analytics 작업 영역에 저장할 수 있습니다.

필수 조건

기본 작업

다음 다이어그램은 json 파일에서 로그 데이터를 수집하는 기본 작업을 보여 줍니다.

  1. 에이전트는 로컬 디스크에서 지정된 이름 패턴과 일치하는 모든 로그 파일을 감시합니다.
  2. 로그의 각 항목은 수집되어 Azure Monitor로 전송됩니다. 사용자가 정의한 수신 스트림은 로그 데이터를 열로 구문 분석하는 데 사용됩니다.
  3. 수신 스트림의 스키마가 대상 테이블의 스키마와 일치하는 경우 기본 변환이 사용됩니다.

쉼표로 분리된 파일 컬렉션 결과를 반환하는 로그 쿼리를 보여 주는 스크린샷.

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

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

  • 파일은 모니터링되는 디렉터리에 Azure Monitor 에이전트가 있는 컴퓨터의 로컬 드라이브에 저장되어야 합니다.
  • 각 레코드는 줄 끝으로 설명되어야 합니다.
  • 파일은 ASCII 또는 UTF-8 인코딩을 사용해야 합니다. UTF-16과 같은 다른 형식은 지원되지 않습니다.
  • 새 레코드는 파일 끝에 추가되어야 하며 이전 레코드를 덮어쓰면 안 됩니다. 덮어쓰면 데이터가 손실됩니다.
  • JSON 텍스트는 한 행에 포함되어야 합니다. JSON 본문 형식은 지원되지 않습니다. 아래 샘플을 참조하세요.

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

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

사용자 지정 테이블

JSON 파일에서 로그 데이터를 수집하려면 먼저 Log Analytics 작업 영역에서 사용자 지정 테이블을 만들어 데이터를 받아야 합니다. 테이블 스키마는 수신 스트림의 열과 일치해야 합니다. 그렇지 않은 경우 출력 스키마가 테이블과 일치하도록 변환을 추가해야 합니다.

Warning

Log Analytics 에이전트에서 사용하는 기존 사용자 지정 테이블을 사용해서는 안 됩니다. 첫 번째 Azure Monitor 에이전트가 테이블에 쓰고 나면 레거시 에이전트는 해당 테이블에 쓸 수 없습니다. Azure Monitor 에이전트에서 Log Analytics 에이전트 데이터 손실을 방지하기 위해 사용할 새 테이블을 만듭니다.

예를 들어 다음 PowerShell 스크립트를 사용하여 여러 열이 있는 사용자 지정 테이블을 만들 수 있습니다.

$tableParams = @'
{
    "properties": {
        "schema": {
               "name": "{TableName}_CL",
               "columns": [
                    {
                        "name": "TimeGenerated",
                        "type": "DateTime"
                    }, 
                    {
                        "name": "MyStringColumn",
                        "type": "string"
                    },
                    {
                        "name": "MyIntegerColumn",
                        "type": "int"
                    },
                    {
                        "name": "MyRealColumn",
                        "type": "real"
                    },
                    {
                        "name": "MyBooleanColumn",
                        "type": "bool"
                    },
                    {
                        "name": "FilePath",
                        "type": "string"
                    },
                    {
                        "name": "Computer",
                        "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

JSON 파일에 대한 데이터 수집 규칙 만들기

참고 항목

에이전트 기반 JSON 사용자 지정 파일 수집은 현재 미리 보기 상태이며 포털에 아직 완전한 UI 환경이 없습니다. 포털을 사용하여 DCR을 만들 수 있지만 수신 스트림에서 열을 정의하도록 수정해야 합니다. 이 섹션에는 ARM 템플릿을 사용하여 DCR을 만드는 방법에 대한 세부 정보가 포함되어 있습니다.

수신 스트림 스키마

참고 항목

구분된 이벤트에 ISO 8601 타임스탬프를 사용하는 여러 줄 지원은 2024년 10월 중순에 제공될 예정입니다.

JSON 파일에는 각 값이 있는 속성 이름이 포함되며 DCR의 수신 스트림에는 각 속성의 이름과 일치하는 열이 포함되어야 합니다. ARM 템플릿의 columns 섹션을 로그의 열로 수정해야 합니다.

다음 표에서는 로그 파일의 데이터를 정의하는 열 외에 포함할 수 있는 선택적 열에 대해 설명합니다.

Column Type 설명
TimeGenerated datetime 레코드가 생성된 시간입니다. 이 값은 수신 스트림에 레코드가 포함되지 않은 경우 Log Analytics 작업 영역에 레코드가 추가되는 시간으로 자동으로 채워집니다.
FilePath string DCR의 수신 스트림에 이 열을 추가하면 로그 파일 경로가 채워집니다. 이 열은 자동으로 만들어지지 않으며 포털을 사용하여 추가할 수 없습니다. 포털에서 만들어진 DCR을 수동으로 수정하거나 수신 스트림을 명시적으로 정의할 수 있는 다른 방법을 사용하여 DCR을 만들어야 합니다.
Computer string DCR의 수신 스트림에 이 열을 추가하면 로그 파일이 있는 컴퓨터 이름으로 채워집니다. 이 열은 자동으로 만들어지지 않으며 포털을 사용하여 추가할 수 없습니다. 포털에서 만들어진 DCR을 수동으로 수정하거나 수신 스트림을 명시적으로 정의할 수 있는 다른 방법을 사용하여 DCR을 만들어야 합니다.

변환

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

ARM 템플릿

다음 ARM 템플릿을 사용하여 텍스트 로그 파일을 수집하기 위한 DCR을 만들고 이전 섹션에 설명된 변경 내용을 적용합니다. 다음 표에서는 템플릿을 배포할 때 값이 필요한 매개 변수를 설명합니다.

설정 설명
데이터 수집 규칙 이름 DCR의 고유한 이름.
데이터 수집 엔드포인트 리소스 ID DCE(데이터 수집 엔드포인트)의 리소스 ID입니다.
위치 DCR 지역. Log Analytics 작업 영역과 동일한 위치여야 합니다.
파일 패턴 로컬 디스크에 있는 로그 파일의 위치와 이름을 식별합니다. 예를 들어, 매일 새 이름으로 새 파일이 만들어지는 경우와 같이 다양한 파일 이름에는 와일드카드를 사용합니다. 여러 파일 패턴을 쉼표로 구분하여 입력할 수 있습니다(Linux에서 여러 파일 패턴을 입력하려면 AMA 버전 1.26 이상 필요).

예:
- C:\Logs\MyLog.json
- C:\Logs\MyLog*.json
- C:\App01\AppLog.json, C:\App02\AppLog.json
- /var/mylog.json
- /var/mylog*.json
테이블 이름 Log Analytics 작업 영역의 대상 테이블 이름입니다.
작업 영역 리소스 ID 대상 테이블이 있는 Log Analytics 작업 영역의 리소스 ID입니다.

Important

ARM 템플릿을 사용하여 DCR을 만드는 경우에도 이를 사용할 에이전트와 DCR을 연결해야 합니다. Azure Portal에서 DCR을 편집하고 리소스 추가에 설명된 대로 에이전트를 선택할 수 있습니다.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "dataCollectionRuleName": {
            "type": "string",
            "metadata": {
                "description": "Unique name for the DCR. "
            }
        },
        "dataCollectionEndpointResourceId": {
            "type": "string",
            "metadata": {
              "description": "Resource ID of the data collection endpoint (DCE)."
            }
        },
        "location": {
            "type": "string",
            "metadata": {
                "description": "Region for the DCR. Must be the same location as the Log Analytics workspace. "
            }
        },
        "filePatterns": {
            "type": "string",
            "metadata": {
                "description": "Path on the local disk for the log file to collect. May include wildcards.Enter multiple file patterns separated by commas (AMA version 1.26 or higher required for multiple file patterns on Linux)."
            }
        },
        "tableName": {
            "type": "string",
            "metadata": {
                "description": "Name of destination table in your Log Analytics workspace. "
            }
        },
        "workspaceResourceId": {
            "type": "string",
            "metadata": {
                "description": "Resource ID of the Log Analytics workspace with the target table."
            }
        }
    },
    "variables": {
        "tableOutputStream": "[concat('Custom-', parameters('tableName'))]"
    },
    "resources": [
        {
            "type": "Microsoft.Insights/dataCollectionRules",
            "apiVersion": "2022-06-01",
            "name": "[parameters('dataCollectionRuleName')]",
            "location": "[parameters('location')]",
            "properties": {
                "dataCollectionEndpointId": "[parameters('dataCollectionEndpointResourceId')]",
                "streamDeclarations": {
                    "Custom-Json-stream": {
                        "columns": [
                            {
                                "name": "TimeGenerated",
                                "type": "datetime"
                            },
                            {
                                "name": "FilePath",
                                "type": "string"
                            },
                            {
                                "name": "MyStringColumn",
                                "type": "string"
                            },
                            {
                                "name": "MyIntegerColumn",
                                "type": "int"
                            },
                            {
                                "name": "MyRealColumn",
                                "type": "real"
                            },
                            {
                                "name": "MyBooleanColumn",
                                "type": "boolean"
                            }
                        ]
                    }
                },
                "dataSources": {
                    "logFiles": [
                        {
                            "streams": [
                                "Custom-Json-stream"
                            ],
                            "filePatterns": [
                                "[parameters('filePatterns')]"
                            ],
                            "format": "json",
                            "name": "Custom-Json-stream"
                        }
                    ]
                },
                "destinations": {
                    "logAnalytics": [
                        {
                            "workspaceResourceId": "[parameters('workspaceResourceId')]",
                            "name": "workspace"
                        }
                    ]
                },
                "dataFlows": [
                    {
                        "streams": [
                            "Custom-Json-stream"
                        ],
                        "destinations": [
                            "workspace"
                        ],
                        "transformKql": "source",
                        "outputStream": "[variables('tableOutputStream')]"
                    }
                ]
            }
        }
    ]
}

문제 해결

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

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

다음 단계

자세히 알아보기: