|
|
@@ -0,0 +1,157 @@
|
|
|
+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 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());
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|