diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 5099e367..4138d1b6 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -28,6 +28,7 @@ services: APP_AUDIT_LOG_PATH: ${APP_AUDIT_LOG_PATH:-/var/log/spring-boot/audit} ports: - "${APP_PORT:-8080}:8080" + - "127.0.0.1:${API_METRICS_HOST_PORT:-19090}:9090" volumes: - spring-boot-logs:/var/log/spring-boot depends_on: @@ -70,6 +71,8 @@ services: condition: service_started rabbitmq: condition: service_healthy + ports: + - "127.0.0.1:${WORKER_METRICS_HOST_PORT:-18000}:8000" restart: unless-stopped loki: diff --git a/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PaymentLogMasking.java b/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PaymentLogMasking.java index 83353aa1..79e59b19 100644 --- a/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PaymentLogMasking.java +++ b/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PaymentLogMasking.java @@ -10,7 +10,6 @@ private PaymentLogMasking() { public static Map paymentContext( String orderId, - String paymentKey, Long userId, String planCode, Integer amount @@ -19,10 +18,6 @@ public static Map paymentContext( if (orderId != null) { context.put("orderId", orderId); } - String maskedPaymentKey = maskPaymentKey(paymentKey); - if (maskedPaymentKey != null) { - context.put("paymentKey", maskedPaymentKey); - } if (userId != null) { context.put("paymentUserId", String.valueOf(userId)); } @@ -35,17 +30,7 @@ public static Map paymentContext( return context; } - public static Map paymentContext(String orderId, String paymentKey, Integer amount) { - return paymentContext(orderId, paymentKey, null, null, amount); - } - - public static String maskPaymentKey(String paymentKey) { - if (paymentKey == null || paymentKey.isBlank()) { - return null; - } - if (paymentKey.length() <= 10) { - return "****"; - } - return paymentKey.substring(0, 6) + "..." + paymentKey.substring(paymentKey.length() - 4); + public static Map paymentContext(String orderId, Integer amount) { + return paymentContext(orderId, null, null, amount); } } diff --git a/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PaymentService.java b/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PaymentService.java index 17a2b3ea..31b7db9d 100644 --- a/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PaymentService.java +++ b/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PaymentService.java @@ -85,7 +85,7 @@ public PaymentPrepareResponse prepare(User user, PaymentPrepareRequest request) try (var ignored = LoggingContext.with( "payment.prepare.started", null, - PaymentLogMasking.paymentContext(null, null, validatedUser.getId(), request.planCode(), plan.getPrice()) + PaymentLogMasking.paymentContext(null, validatedUser.getId(), request.planCode(), plan.getPrice()) )) { log.info("Starting payment preparation"); } @@ -139,7 +139,7 @@ public PaymentPrepareResponse prepare(User user, PaymentPrepareRequest request) try (var ignored = LoggingContext.with( "payment.create.completed", null, - PaymentLogMasking.paymentContext(payment.getOrderId(), null, validatedUser.getId(), plan.getCode(), plan.getPrice()) + PaymentLogMasking.paymentContext(payment.getOrderId(), validatedUser.getId(), plan.getCode(), plan.getPrice()) )) { log.info("Payment preparation completed"); } @@ -175,7 +175,7 @@ private PaymentPrepareResponse preparePortOne(User validatedUser, CreditPlan pla try (var ignored = LoggingContext.with( "payment.portone.prepare.completed", null, - PaymentLogMasking.paymentContext(payment.getOrderId(), null, validatedUser.getId(), plan.getCode(), plan.getPrice()) + PaymentLogMasking.paymentContext(payment.getOrderId(), validatedUser.getId(), plan.getCode(), plan.getPrice()) )) { log.info("PortOne payment preparation completed"); } @@ -197,7 +197,6 @@ public PaymentConfirmResponse confirm(User user, PaymentConfirmRequest request) User validatedUser = userService.validateUser(user); Map paymentContext = PaymentLogMasking.paymentContext( request.orderId(), - request.paymentKey(), validatedUser.getId(), null, request.amount() @@ -329,7 +328,7 @@ public void handlePortOneWebhook(String rawBody, HttpHeaders headers) { try (var ignored = LoggingContext.with( "payment.portone.webhook.ignored", e.getCode(), - PaymentLogMasking.paymentContext(payload.data().paymentId(), null, null) + PaymentLogMasking.paymentContext(payload.data().paymentId(), null) )) { log.warn("PortOne webhook ignored: {}", e.getMessage()); } @@ -343,7 +342,6 @@ public void handlePortOneWebhook(String rawBody, HttpHeaders headers) { public void handleTossPayCallback(TossPayCallbackRequest request) { Map paymentContext = PaymentLogMasking.paymentContext( request == null ? null : request.orderNo(), - request == null ? null : request.payToken(), request == null ? null : request.amount() ); try (var ignored = LoggingContext.with("payment.callback.received", null, paymentContext)) { @@ -436,7 +434,6 @@ private void validateTossResponse(Long userId, PaymentConfirmRequest request, To String easyPayProvider = response.easyPay() == null ? null : response.easyPay().provider(); Map paymentContext = PaymentLogMasking.paymentContext( request.orderId(), - request.paymentKey(), userId, null, request.amount() diff --git a/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PortOneClient.java b/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PortOneClient.java index 91d84b74..1dad2352 100644 --- a/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PortOneClient.java +++ b/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PortOneClient.java @@ -85,7 +85,7 @@ public String storeId() { public PortOnePaymentResponse getPayment(String paymentId) { ensureConfigured(); ensureRequestValue(paymentId, "paymentId"); - Map paymentContext = PaymentLogMasking.paymentContext(paymentId, null, null); + Map paymentContext = PaymentLogMasking.paymentContext(paymentId, null); try (var ignored = LoggingContext.with("payment.portone.status.external_called", null, paymentContext)) { log.info("Calling PortOne get payment API"); } @@ -129,7 +129,7 @@ public PortOnePaymentResponse getPayment(String paymentId) { public PortOneCancelResponse cancelPayment(String paymentId, int amount, String reason) { ensureConfigured(); ensureRequestValue(paymentId, "paymentId"); - Map paymentContext = PaymentLogMasking.paymentContext(paymentId, null, amount); + Map paymentContext = PaymentLogMasking.paymentContext(paymentId, amount); try (var ignored = LoggingContext.with("payment.portone.refund.external_called", null, paymentContext)) { log.info("Calling PortOne cancel payment API"); } diff --git a/src/main/java/com/jobdri/jobdri_api/domain/payment/service/TossPayClient.java b/src/main/java/com/jobdri/jobdri_api/domain/payment/service/TossPayClient.java index c7e391b1..6fb09100 100644 --- a/src/main/java/com/jobdri/jobdri_api/domain/payment/service/TossPayClient.java +++ b/src/main/java/com/jobdri/jobdri_api/domain/payment/service/TossPayClient.java @@ -62,7 +62,7 @@ void init() { public TossPayCreateResponse createPayment(String orderNo, int amount, String productDesc) { ensureCreatePaymentConfigured(); - Map paymentContext = PaymentLogMasking.paymentContext(orderNo, null, amount); + Map paymentContext = PaymentLogMasking.paymentContext(orderNo, amount); try (var ignored = LoggingContext.with("payment.create.external_called", null, paymentContext)) { log.info("Calling Toss Pay create payment API"); } @@ -148,7 +148,7 @@ public TossPayRefundResponse refundPayment( String reason ) { ensureRefundConfigured(payToken, orderNo, refundNo); - Map paymentContext = PaymentLogMasking.paymentContext(orderNo, payToken, amount); + Map paymentContext = PaymentLogMasking.paymentContext(orderNo, amount); try (var ignored = LoggingContext.with("payment.tosspay.refund.external_called", null, paymentContext)) { log.info("Calling Toss Pay refund API"); } diff --git a/src/main/java/com/jobdri/jobdri_api/domain/payment/service/TossPaymentClient.java b/src/main/java/com/jobdri/jobdri_api/domain/payment/service/TossPaymentClient.java index fdcdbbf5..9358498d 100644 --- a/src/main/java/com/jobdri/jobdri_api/domain/payment/service/TossPaymentClient.java +++ b/src/main/java/com/jobdri/jobdri_api/domain/payment/service/TossPaymentClient.java @@ -57,7 +57,7 @@ public TossPaymentConfirmResponse confirm(String paymentKey, String orderId, int if (secretKey == null || secretKey.isBlank()) { throw new GeneralException(GeneralErrorCode.PAYMENT_CONFIRM_FAILED, "토스페이먼츠 시크릿 키가 설정되지 않았습니다."); } - Map paymentContext = PaymentLogMasking.paymentContext(orderId, paymentKey, amount); + Map paymentContext = PaymentLogMasking.paymentContext(orderId, amount); try (var ignored = LoggingContext.with("payment.confirm.external_called", null, paymentContext)) { log.info("Calling Toss payment confirm API"); } diff --git a/src/main/resources/application-prod.yaml b/src/main/resources/application-prod.yaml index 6cbbb987..b351123f 100644 --- a/src/main/resources/application-prod.yaml +++ b/src/main/resources/application-prod.yaml @@ -81,6 +81,7 @@ app: logging: path: ${APP_LOG_PATH:/var/log/spring-boot} audit-path: ${APP_AUDIT_LOG_PATH:/var/log/spring-boot/audit} + environment: ${APP_LOG_ENVIRONMENT:production} oauth2: redirect-uri: ${APP_OAUTH2_REDIRECT_URI} worker: diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index a7e1dfbe..a909d3ce 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -18,5 +18,6 @@ app: logging: path: ${APP_LOG_PATH:logs} audit-path: ${APP_AUDIT_LOG_PATH:logs/audit} + environment: ${APP_LOG_ENVIRONMENT:local} request-id-max-length: ${APP_LOG_REQUEST_ID_MAX_LENGTH:64} trusted-proxies: ${APP_LOG_TRUSTED_PROXIES:} diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index e30e645f..9d5428ca 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -3,6 +3,7 @@ + @@ -11,12 +12,42 @@ name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg %mdc%n%ex{full}" /> - - - ${CONSOLE_LOG_PATTERN} - UTF-8 - - + + + + Asia/Seoul + true + requestId + method + uri + logType + event + errorCode + taskId + messageId + taskType + retryCount + workerId + queueLatencyMillis + {"service":"${APP_NAME}","service_name":"${APP_NAME}","environment":"${APP_ENVIRONMENT}"} + + timestamp + logger_name + thread + stack_trace + + + + + + + + + ${CONSOLE_LOG_PATTERN} + UTF-8 + + + ${APPLICATION_LOG_FILE} @@ -29,7 +60,7 @@ Asia/Seoul true - {"service":"${APP_NAME}"} + {"service":"${APP_NAME}","service_name":"${APP_NAME}","environment":"${APP_ENVIRONMENT}"} timestamp logger_name @@ -50,7 +81,7 @@ Asia/Seoul true - {"service":"${APP_NAME}"} + {"service":"${APP_NAME}","service_name":"${APP_NAME}","environment":"${APP_ENVIRONMENT}"} timestamp logger_name