|
|
@@ -1,167 +0,0 @@
|
|
|
-package com.ruoyi.common.aws.cloudwatch;
|
|
|
-
|
|
|
-import lombok.extern.slf4j.Slf4j;
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
-import software.amazon.awssdk.services.cloudwatchlogs.CloudWatchLogsClient;
|
|
|
-import software.amazon.awssdk.services.cloudwatchlogs.model.*;
|
|
|
-
|
|
|
-import java.time.Instant;
|
|
|
-import java.util.UUID;
|
|
|
-
|
|
|
-/**
|
|
|
- * AWS CloudWatch Logsサービスクラス
|
|
|
- *
|
|
|
- * @author ruoyi
|
|
|
- */
|
|
|
-@Slf4j
|
|
|
-@Service
|
|
|
-public class AwsCloudWatchLogsService {
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private AwsCloudWatchConfig awsCloudWatchConfig;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private CloudWatchLogsClient cloudWatchLogsClient;
|
|
|
-
|
|
|
- /**
|
|
|
- * ログをCloudWatch Logsに送信
|
|
|
- *
|
|
|
- * @param message ログメッセージ
|
|
|
- * @param level ログレベル(INFO, WARN, ERRORなど)
|
|
|
- * @return 送信成功かどうか
|
|
|
- */
|
|
|
- public boolean sendLog(String message, String level) {
|
|
|
- try {
|
|
|
- String logGroup = awsCloudWatchConfig.getLogGroup();
|
|
|
- String logStreamPrefix = awsCloudWatchConfig.getLogStreamPrefix();
|
|
|
-
|
|
|
- // ロググループが存在しない場合は作成
|
|
|
- createLogGroupIfNotExists(logGroup);
|
|
|
-
|
|
|
- // ログストリーム名を生成(プレフィックス + タイムスタンプ + UUID)
|
|
|
- String logStreamName = logStreamPrefix + "-" +
|
|
|
- Instant.now().toEpochMilli() + "-" +
|
|
|
- UUID.randomUUID().toString().substring(0, 8);
|
|
|
-
|
|
|
- // ログストリームを作成
|
|
|
- createLogStream(logGroup, logStreamName);
|
|
|
-
|
|
|
- // ログイベントを送信
|
|
|
- PutLogEventsRequest request = PutLogEventsRequest.builder()
|
|
|
- .logGroupName(logGroup)
|
|
|
- .logStreamName(logStreamName)
|
|
|
- .logEvents(InputLogEvent.builder()
|
|
|
- .message("[" + level + "] " + message)
|
|
|
- .timestamp(Instant.now().toEpochMilli())
|
|
|
- .build())
|
|
|
- .build();
|
|
|
-
|
|
|
- PutLogEventsResponse response = cloudWatchLogsClient.putLogEvents(request);
|
|
|
-
|
|
|
- log.info("CloudWatch Logsにログを送信しました: グループ={}, ストリーム={}, レベル={}",
|
|
|
- logGroup, logStreamName, level);
|
|
|
-
|
|
|
- return true;
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("CloudWatch Logsへのログ送信に失敗しました: {}", e.getMessage(), e);
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 情報ログを送信
|
|
|
- *
|
|
|
- * @param message ログメッセージ
|
|
|
- * @return 送信成功かどうか
|
|
|
- */
|
|
|
- public boolean sendInfoLog(String message) {
|
|
|
- return sendLog(message, "INFO");
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 警告ログを送信
|
|
|
- *
|
|
|
- * @param message ログメッセージ
|
|
|
- * @return 送信成功かどうか
|
|
|
- */
|
|
|
- public boolean sendWarnLog(String message) {
|
|
|
- return sendLog(message, "WARN");
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * エラーログを送信
|
|
|
- *
|
|
|
- * @param message ログメッセージ
|
|
|
- * @return 送信成功かどうか
|
|
|
- */
|
|
|
- public boolean sendErrorLog(String message) {
|
|
|
- return sendLog(message, "ERROR");
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 致命的エラーログを送信
|
|
|
- *
|
|
|
- * @param message ログメッセージ
|
|
|
- * @return 送信成功かどうか
|
|
|
- */
|
|
|
- public boolean sendFatalLog(String message) {
|
|
|
- return sendLog(message, "FATAL");
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * ロググループが存在しない場合は作成
|
|
|
- *
|
|
|
- * @param logGroupName ロググループ名
|
|
|
- */
|
|
|
- private void createLogGroupIfNotExists(String logGroupName) {
|
|
|
- try {
|
|
|
- // ロググループの存在確認
|
|
|
- DescribeLogGroupsRequest describeRequest = DescribeLogGroupsRequest.builder()
|
|
|
- .logGroupNamePrefix(logGroupName)
|
|
|
- .build();
|
|
|
-
|
|
|
- DescribeLogGroupsResponse describeResponse = cloudWatchLogsClient.describeLogGroups(describeRequest);
|
|
|
-
|
|
|
- boolean exists = describeResponse.logGroups().stream()
|
|
|
- .anyMatch(group -> group.logGroupName().equals(logGroupName));
|
|
|
-
|
|
|
- if (!exists) {
|
|
|
- // ロググループを作成
|
|
|
- CreateLogGroupRequest createRequest = CreateLogGroupRequest.builder()
|
|
|
- .logGroupName(logGroupName)
|
|
|
- .build();
|
|
|
-
|
|
|
- cloudWatchLogsClient.createLogGroup(createRequest);
|
|
|
- log.info("CloudWatch Logsグループを作成しました: {}", logGroupName);
|
|
|
- }
|
|
|
- } catch (ResourceAlreadyExistsException e) {
|
|
|
- // 既に存在する場合は無視
|
|
|
- log.debug("ロググループは既に存在します: {}", logGroupName);
|
|
|
- } catch (Exception e) {
|
|
|
- log.warn("ロググループの作成/確認に失敗しました: {}", e.getMessage());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * ログストリームを作成
|
|
|
- *
|
|
|
- * @param logGroupName ロググループ名
|
|
|
- * @param logStreamName ログストリーム名
|
|
|
- */
|
|
|
- private void createLogStream(String logGroupName, String logStreamName) {
|
|
|
- try {
|
|
|
- CreateLogStreamRequest request = CreateLogStreamRequest.builder()
|
|
|
- .logGroupName(logGroupName)
|
|
|
- .logStreamName(logStreamName)
|
|
|
- .build();
|
|
|
-
|
|
|
- cloudWatchLogsClient.createLogStream(request);
|
|
|
- } catch (ResourceAlreadyExistsException e) {
|
|
|
- // 既に存在する場合は無視
|
|
|
- log.debug("ログストリームは既に存在します: {}/{}", logGroupName, logStreamName);
|
|
|
- } catch (Exception e) {
|
|
|
- log.warn("ログストリームの作成に失敗しました: {}", e.getMessage());
|
|
|
- }
|
|
|
- }
|
|
|
-}
|