Java 로그와 추적 데이터 연동¶
Java 애플리케이션 로그와 분산 추적 데이터를 연동하려면 다음 단계를 수행해야 합니다.
- 애플리케이션에서 로그 활성화
- Datakit에서 추적 데이터 수집을 활성화하고 로그 파싱을 위한 Pipeline 스크립트를 구성한 후 Datakit 시작
Java애플리케이션 시작
로그 Maven 종속성 추가¶
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.5.1</version>
</dependency>
로그 설정 파일¶
<!--dataflux 모니터링 로그-->
<appender name="ALL_DATAFLUX" class="ch.qos.logback.core.FileAppender">
<file>${USER_HOME}/platform_dataflux.log</file>
<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<root level="INFO">
<appender-ref ref="ALL_DATAFLUX" />
</root>
Datakit logging.conf 설정¶
마이크로서비스 예시 (운영팀에 로그 볼륨 마운트 경로 확인 필요):
[[inputs.logging]]
logfiles = [
"/rootfs/k8s/logdata/cf-platform-prod/adapter/platform_dataflux.log"
]
ignore = [""]
source = "cc-adapter"
service = "cc-adapter"
pipeline = ""
ignore_status = []
character_encoding = ""
match = '''^\S'''
[inputs.logging.tags]
[[inputs.logging]]
logfiles = [
"/rootfs/k8s/logdata/cf-platform-prod/billing/platform_dataflux.log"
]
ignore = [""]
source = "cc-billing"
service = "cc-billing"
pipeline = ""
ignore_status = []
character_encoding = ""
match = '''^\S'''
[inputs.logging.tags]
[[inputs.logging]]
logfiles = [
"/rootfs/k8s/logdata/cf-platform-prod/security/platform_dataflux.log"
]
ignore = [""]
source = "cc-security"
service = "cc-security"
pipeline = ""
ignore_status = []
character_encoding = ""
match = '''^\S'''
[inputs.logging.tags]
[[inputs.logging]]
logfiles = [
"/rootfs/k8s/logdata/cf-platform-prod/misc/platform_dataflux.log"
]
ignore = [""]
source = "cc-misc"
service = "cc-misc"
pipeline = ""
ignore_status = []
character_encoding = ""
match = '''^\S'''
[inputs.logging.tags]
[[inputs.logging]]
logfiles = [
"/rootfs/k8s/logdata/cf-platform-prod/user/platform_dataflux.log"
]
ignore = [""]
source = "cc-user"
service = "cc-user"
pipeline = ""
ignore_status = []
character_encoding = ""
match = '''^\S'''
[inputs.logging.tags]
[[inputs.logging]]
logfiles = [
"/rootfs/k8s/logdata/cf-platform-prod/product/platform_dataflux.log"
]
ignore = [""]
source = "cc-product"
service = "cc-product"
pipeline = ""
ignore_status = []
character_encoding = ""
match = '''^\S'''
[inputs.logging.tags]
Java 애플리케이션 시작¶
다음 명령어로 Java 애플리케이션을 시작합니다.
java -javaagent:/your/path/dd-java-agent.jar \
-Ddd.logs.injection=true \
-Ddd.service.name=cbis-billing \
-Ddd.env=staging \
-Ddd.version=1.0 \
-Ddd.agent.host=127.0.0.1 \
-Ddd.agent.port=9529 \
-jar /your/path/app.jar
Pipeline 스크립트 구성¶
수집된 로그 형식은 다음과 같습니다.
{"@timestamp":"2021-06-24T14:17:53.563+08:00","@version":1,"message":"<=> invoke action [CheckModule@saveDfBillToDbSchedule] take time : 72ms ","logger_name":"com.cloudcare.web.container.interceptor.LoggerInterceptor","thread_name":"qtp454424866-39","level":"DEBUG","level_value":10000,"HOSTNAME":"LAPTOP-IA9RA81K","request_host":"127.0.0.1:8106","action_name":"CheckModule@saveDfBillToDbSchedule","request_id":"60d423840fe1874814490456","request_remote_host":"192.168.241.1","response_error_code":"Worker.NotFound","dd.service":"billing","dd.env":"staging","dd.span_id":"5577585360079661786","dd.trace_id":"6724368348029357447","dd.version":"1.0","tags":["operation"]}
로그 데이터는 추적 데이터와 연동되기 전에 파싱 및 변환 과정이 필요합니다. 이는 Pipeline 스크립트를 통해 구현할 수 있습니다.
json(_, message)
json(_, `dd.service`, service)
json(_, `dd.env`, env)
json(_, `dd.version`, version)
json(_, `dd.trace_id`, trace_id)
json(_, `dd.span_id`, span_id)
json(_, `@timestamp`, time)
default_time(time)
Pipeline 스크립트로 파싱 및 변환 후 데이터는 다음과 같습니다. trace_id, span_id 등의 필드를 통해 로그 데이터와 추적 데이터가 연동됩니다.