Apache log4J 2 커넥터를 사용하여 데이터 수집
Log4J는 Apache Foundation에서 유지 관리하는 Java 애플리케이션에 널리 사용되는 로깅 프레임워크입니다. Log4J를 사용하면 개발자가 로거 이름, 로거 수준 및 메시지 패턴에 따라 임의의 세분성으로 출력되는 로그 문을 제어할 수 있습니다. Apache Log4J 2 는 Log4J로 업그레이드되어 이전 Log4j 1.x보다 크게 향상되었습니다. Log4J 2는 Logback 아키텍처의 몇 가지 내재된 문제를 해결하는 동시에 Logback에서 사용할 수 있는 많은 향상된 기능을 제공합니다. 추가 관리자라고도 하는 Apache log4J 2 싱크는 로그 데이터를 Kusto의 테이블로 스트리밍하여 실시간으로 로그를 분석하고 시각화할 수 있습니다.
데이터 커넥터의 전체 목록은 데이터 통합 개요를 참조하세요.
필수 조건
- Apache Maven
- Microsoft Fabric의 Azure Data Explorer 클러스터 및 데이터베이스 또는 KQL 데이터베이스
환경 설정
이 섹션에서는 Log4J 2 싱크를 사용하도록 환경을 준비합니다.
패키지 설치
애플리케이션에서 싱크를 사용하려면 pom.xml Maven 파일에 다음 종속성을 추가합니다. 싱크에는 log4j-core 가 애플리케이션에서 종속성으로 제공되어야 합니다.
<dependency>
<groupId>com.microsoft.azure.kusto</groupId>
<artifactId>azure-kusto-log4j</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
Microsoft Entra 앱 등록 만들기
Azure CLI를 통해 Azure 구독에 로그인합니다. 그런 다음 브라우저에서 인증합니다.
az login
보안 주체를 호스트할 구독을 선택합니다. 이 단계는 여러 구독이 있는 경우에 필요합니다.
az account set --subscription YOUR_SUBSCRIPTION_GUID
서비스 주체를 만듭니다. 이 예에서는 서비스 주체를
my-service-principal
이라고 합니다.az ad sp create-for-rbac -n "my-service-principal" --role Contributor --scopes /subscriptions/{SubID}
반환된 JSON 데이터에서 복사
password
tenant
하고appId
나중에 사용할 수 있습니다.{ "appId": "1234abcd-e5f6-g7h8-i9j0-1234kl5678mn", "displayName": "my-service-principal", "name": "my-service-principal", "password": "1234abcd-e5f6-g7h8-i9j0-1234kl5678mn", "tenant": "1234abcd-e5f6-g7h8-i9j0-1234kl5678mn" }
Microsoft Entra 애플리케이션과 서비스 주체를 만들었습니다.
Microsoft Entra 앱 권한 부여
쿼리 환경에서 다음 관리 명령을 실행하여 자리 표시자 DatabaseName 및 애플리케이션 ID 를 이전에 저장된 값으로 바꿉니다. 이 명령은 앱 에 데이터베이스 수집기 역할을 부여합니다. 자세한 내용은 데이터베이스 보안 역할 관리를 참조 하세요.
.add database DatabaseName ingestors ('aadappID=12345-abcd-12a3-b123-ccdd12345a1b') 'App Registration'
참고 항목
마지막 매개 변수는 데이터베이스와 연결된 역할을 쿼리할 때 메모로 표시되는 문자열입니다. 자세한 내용은 데이터베이스 역할 관리를 참조 하세요.
테이블 및 수집 매핑 만들기
수집된 데이터 열을 대상 테이블의 열에 매핑하여 들어오는 데이터에 대한 대상 테이블을 만듭니다. 다음 단계에서 테이블 스키마 및 매핑은 샘플 앱에서 보낸 데이터에 해당합니다.
쿼리 편집기에서 다음 테이블 만들기 명령을 실행하여 자리 표시자 TableName 을 대상 테이블의 이름으로 바꿉니다.
.create table log4jTest (timenanos:long,timemillis:long,level:string,threadid:string,threadname:string,threadpriority:int,formattedmessage:string,loggerfqcn:string,loggername:string,marker:string,thrownproxy:string,source:string,contextmap:string,contextstack:string)
다음 수집 매핑 명령을 실행하여 자리 표시자 TableName 을 대상 테이블 이름으로 , TableNameMapping 을 수집 매핑의 이름으로 바꿉다.
.create table log4jTest ingestion csv mapping 'log4jCsvTestMapping' '[{"Name":"timenanos","DataType":"","Ordinal":"0","ConstValue":null},{"Name":"timemillis","DataType":"","Ordinal":"1","ConstValue":null},{"Name":"level","DataType":"","Ordinal":"2","ConstValue":null},{"Name":"threadid","DataType":"","Ordinal":"3","ConstValue":null},{"Name":"threadname","DataType":"","Ordinal":"4","ConstValue":null},{"Name":"threadpriority","DataType":"","Ordinal":"5","ConstValue":null},{"Name":"formattedmessage","DataType":"","Ordinal":"6","ConstValue":null},{"Name":"loggerfqcn","DataType":"","Ordinal":"7","ConstValue":null},{"Name":"loggername","DataType":"","Ordinal":"8","ConstValue":null},{"Name":"marker","DataType":"","Ordinal":"9","ConstValue":null},{"Name":"thrownproxy","DataType":"","Ordinal":"10","ConstValue":null},{"Name":"source","DataType":"","Ordinal":"11","ConstValue":null},{"Name":"contextmap","DataType":"","Ordinal":"12","ConstValue":null},{"Name":"contextstack","DataType":"","Ordinal":"13","ConstValue":null}]'
앱에 Log4j 2 싱크 추가
다음 단계를 사용하여 다음을 수행합니다.
- 앱에 Log4j 2 싱크 추가
- 싱크에서 사용하는 변수 구성
- 앱 빌드 및 실행
앱에 다음 코드를 추가합니다.
package com.microsoft.azure.kusto.log4j.sample; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;
log4j2.xml 파일에 항목을 추가하여
KustoStrategy
Log4j 2 싱크를 구성하고 다음 표의 정보를 사용하여 자리 표시자를 바꿉니다.log4J 2 커넥터는 RollingFileAppender에 사용되는 사용자 지정 전략을 사용합니다. Kusto 클러스터에 연결하는 동안 네트워크 오류로 인해 발생하는 데이터 손실을 방지하기 위해 로그가 롤링 파일에 기록됩니다. 데이터는 롤링 파일에 저장되고 Kusto 클러스터로 플러시됩니다.
<KustoStrategy clusterIngestUrl = "${env:LOG4J2_ADX_INGEST_CLUSTER_URL}" appId = "${env:LOG4J2_ADX_APP_ID}" appKey = "${env:LOG4J2_ADX_APP_KEY}" appTenant = "${env:LOG4J2_ADX_TENANT_ID}" dbName = "${env:LOG4J2_ADX_DB_NAME}" tableName = "<MyTable>" logTableMapping = "<MyTableCsvMapping>" mappingType = "csv" flushImmediately = "false" />
속성 설명 clusterIngestUrl 형식 https://ingest-<클러스터>의 클러스터에 대한 수집 URI입니다.<region.kusto.windows.net>. dbName 대상 데이터베이스의 대/소문자 구분 이름입니다. tableName 기존 대상 테이블의 대/소문자를 구분하는 이름입니다. 예를 들어 Log4jTest는 테이블 만들기 및 수집 매핑에서 만든 테이블의 이름입니다. appId 인증에 필요한 애플리케이션 클라이언트 ID입니다. Microsoft Entra 앱 등록 만들기에 이 값을 저장했습니다. appKey 인증에 필요한 애플리케이션 키입니다. Microsoft Entra 앱 등록 만들기에 이 값을 저장했습니다. appTenant 애플리케이션이 등록된 테넌트 ID입니다. Microsoft Entra 앱 등록 만들기에 이 값을 저장했습니다. logTableMapping 매핑의 이름입니다. mappingType 사용할 매핑의 형식입니다. 기본값은 csv입니다. flushImmediately true로 설정하면 싱크는 각 로그 이벤트 후 버퍼를 플러시합니다. 기본값은 false입니다. 자세한 옵션은 싱크 옵션을 참조 하세요.
Log4j 2 싱크를 사용하여 Kusto로 데이터를 보냅니다. 예시:
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class MyClass { private static final Logger logger = LogManager.getLogger(KustoLog4JSampleApp.class); public static void main(String[] args) { Runnable loggingTask = () -> { logger.trace(".....read_physical_netif: Home list entries returned = 7"); logger.debug(".....api_reader: api request SENDER"); logger.info(".....read_physical_netif: index #0, interface VLINK1 has address 129.1.1.1, ifidx 0"); logger.warn(".....mailslot_create: setsockopt(MCAST_ADD) failed - EDC8116I Address not available."); logger.error(".....error_policyAPI: APIInitializeError: ApiHandleErrorCode = 98BDFB0, errconnfd = 22"); logger.fatal(".....fatal_error_timerAPI: APIShutdownError: ReadBuffer = 98BDFB0, RSVPGetTSpec = error"); }; ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); executor.scheduleAtFixedRate(loggingTask, 0, 3, TimeUnit.SECONDS); } }
앱을 빌드하고 실행합니다.
데이터가 클러스터에 있는지 확인합니다. 쿼리 환경에서 자리 표시자를 이전에 사용한 테이블 이름으로 바꾸는 다음 쿼리를 실행합니다.
<TableName> | take 10
샘플 앱 실행
다음 git 명령을 사용하여 log4J 2 git 리포지토리 를 복제합니다.
git clone https://github.com/Azure/azure-kusto-log4j.git
Log4J 2 싱크를 구성하려면 다음 환경 변수를 설정합니다.
참고 항목
git 리포지토리에 포함된 샘플 프로젝트에서 기본 구성 형식은 파일 log4j2.xml 정의됩니다. 이 구성 파일은 \azure-kusto-log4j\samples\src\main\resources\log4j2.xml 파일 경로 아래에 있습니다.
터미널에서 복제된 리포지토리의 샘플 폴더로 이동하고 다음 Maven 명령을 실행합니다.
mvn compile exec:java -Dexec.mainClass="org.example.KustoLog4JSampleApp"
쿼리 환경에서 대상 데이터베이스를 선택하고 다음 쿼리를 실행하여 수집된 데이터를 탐색하고 자리 표시자 TableName 을 대상 테이블의 이름으로 바꿉다.
<TableName> | take 10
출력은 다음 표와 유사합니다.
관련 콘텐츠
- 데이터 커넥터 개요
- KQL(Kusto 쿼리 언어) 개요
- Azure Databricks Log4J에서 Azure Data Explorer Git 리포지토리로 시작
- Log4j2 - Azure Data Explorer 커넥터 커뮤니티 블로그를 사용하여 Azure Databricks 로그를 Azure Data Explorer에 수집