- 가독성을 위해 pretty로 정리하였습니다.
logback Logstash encoder 사용
logback Logstash encoder 사용 요청드립니다.
logback 설정 예시 :
<appender name="transaction-file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${APPLICATION_NAME}/${HOSTNAME}_${TRANSACTION_LOG_FILE}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${APPLICATION_NAME}/${HOSTNAME}_${TRANSACTION_LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<includeContext>true</includeContext>
<includeCallerData>true</includeCallerData>
<timestampPattern>yyyy-MM-dd HH:mm:ss.SSS</timestampPattern>
</encoder>
</appender>
<appender name="async" class="net.logstash.logback.appender.LoggingEventAsyncDisruptorAppender">
<appender-ref ref="transaction-file"/>
</appender>
<!-- 로깅 범위 및 레벨 설정 -->
<logger name="trx" level="INFO" additivity="false">
<appender-ref ref="async"/>
</logger>
java 구현 예시 :
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
@Slf4j
public class LoggingServiceImpl implements LoggingService {
private static final Logger trxlogger = LoggerFactory.getLogger("trx");
...
logVo.setAPPLICATION_TYPE("Gateway");
...
trxlogger.info("log", f(logVo));
}
logback Logstash encoder 설정 : timestamp, logger_name 등은 logback Logstash encoder 가 자동으로 넣어줍니다.
logback logstash encoder를 사용해서 전달 주시면 OTEL 에서 자동으로
ServiceName, SpanID, TraceID, slf4j 키-값 쌍 등을 넣어줍니다.
아래 항목은 자동으로 넣어지는 값입니다.
"@timestamp": "2024-11-22 14:25:00.000",
"logger_name": "trx",
"trace_id": "7d3b8ba6485c23ea02db9ffab4b6eaeb",
"trace_flags": "01",
"span_id": "f1236d3a20579213",
...
200 log
{
"@timestamp": "2024-11-21 02:33:15.938",
"@version": "1",
"message": "log",
"logger_name": "trx",
"thread_name": "reactor-http-epoll-4",
"level": "INFO",
"level_value": 20000,
"HOSTNAME": "gateway-84899bbf6f-67l45",
"trace_id": "7d3b8ba6485c23ea02db9ffab4b6eaeb",
"trace_flags": "01",
"span_id": "f1236d3a20579213",
"request_BODY": "test",
"response_BODY": "test",
"transaction_MONTH": 11,
"transaction_DAY": 21,
"end_DATE": null,
"api_ID": "test",
"api_NAME": "test",
"transaction_TYPE": "HTTP",
"pre_FLOW_ID": "defaultFlow",
"post_FLOW_ID": "defaultFlow",
"status_CODE": 200,
"error_MESSAGE": null,
"host_NAME": "gateway-84899bbf6f-67l45",
"subscription_CODE": null,
"oauth_TOKEN_ID": null,
"api_KEY": "",
"step": "60",
"request_HEADER": {
"Content-Type": "application/json",
"User-Agent": "PostmanRuntime/7.42.0",
"Accept": "*/*",
"Postman-Token": "7b6bba49-9096-461d-b215-6b778d05b961",
"Host": "192.168.3.153:30731",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"Content-Length": "4",
"X-Forwarded-For": "10.0.0.143"
},
"response_HEADER": {
"host": "echo-server:58080",
"user-agent": "PostmanRuntime/7.42.0",
"accept": "*/*",
"postman-token": "7b6bba49-9096-461d-b215-6b778d05b961",
"accept-encoding": "gzip, deflate, br",
"traceparent": "00-7d3b8ba6485c23ea02db9ffab4b6eaeb-64ed7e54b53954d7-01",
"Content-Type": "application/json",
"Content-Length": "4",
"Date": "Thu, 21 Nov 2024 02:33:15 GMT"
},
"application_TYPE": "Gateway",
"host": ["192.168.3.153:30731"],
"url": "/echo/test"
}
500 log
{
"@timestamp": "2024-10-30 03:10:57.452",
"@version": "1",
"message": "log",
"logger_name": "trx",
"thread_name": "reactor-http-epoll-11",
"level": "INFO",
"level_value": 20000,
"HOSTNAME": "gateway-5b94d94dfd-qzns9",
"trace_id": "0e5486f57a8000aa47e3ef1d97939928",
"trace_flags": "01",
"span_id": "66b0b7c2c0c1ba3c",
"request_BODY": "asdf",
"response_BODY": {
"status_code": 500,
"rsp_code": "Engine-50001",
"rsp_msg": "시스템장애"
},
"transaction_MONTH": 10,
"transaction_DAY": 30,
"end_DATE": null,
"api_ID": "test",
"api_NAME": "test",
"transaction_TYPE": "HTTP",
"pre_FLOW_ID": "sample_flow",
"post_FLOW_ID": "sample_flow",
"status_CODE": 500,
"error_MESSAGE": null,
"host_NAME": "gateway-5b94d94dfd-qzns9",
"subscription_CODE": null,
"oauth_TOKEN_ID": null,
"api_KEY": "",
"step": "60",
"request_HEADER": {
"Host": "192.168.3.158",
"User-Agent": "curl/7.81.0",
"Accept": "*/*",
"content-type": "text/plain",
"Content-Length": "4",
"X-Forwarded-For": "10.42.6.0"
},
"response_HEADER": {
"Content-Type": "application/json;charset=UTF-8",
"Date": "Wed, 30 Oct 2024 03:10:57 GMT",
"content-length": "78"
},
"application_TYPE": "Gateway",
"host": ["192.168.3.158"],
"url": "/echo/test"
}
'Monitoring > Signoz' 카테고리의 다른 글
Signoz Cloud 버전을 Helm chart to Yaml로 설치 (1) (2) | 2025.02.07 |
---|---|
오픈 소스 APM도구 SIGNOZ (2) (6) | 2025.02.05 |
오픈 소스 APM도구 SIGNOZ (1) (0) | 2025.02.05 |
ClickhouseDB JSONExtractString 쿼리 실행에 CANNOT_ALLOCATE_MEMORY 에러가 발생하는 오류 (0) | 2024.06.07 |