Skip to content

269 feat 로그 개선#273

Open
omegafrog wants to merge 5 commits intodevelopfrom
269-feat-로그-개선

Hidden character warning

The head ref may contain hidden characters: "269-feat-\ub85c\uadf8-\uac1c\uc120"
Open

269 feat 로그 개선#273
omegafrog wants to merge 5 commits intodevelopfrom
269-feat-로그-개선

Conversation

@omegafrog
Copy link
Collaborator

@omegafrog omegafrog commented May 15, 2025

🔎 작업 내용

컨트롤러 단에서 요청한 유저의 role, userId, ip addr를 수집합니다.

  • ⚡️ 새로운 기능 추가
  • 🐛버그 수정
  • 💄 코드에 영향을 주지 않는 변경사항(오타 수정, 탭 사이즈 변경, 변수명 변경)
  • ♻️️ 코드 리팩토링(성능, 기능 메서드)
  • 📈 주석 추가 및 수정
  • 📝 문서 수정
  • ✅ 테스트 추가, 테스트 리팩토링
  • 🔧 빌드 부분 혹은 패키지 매니저 수정
  • 💚 파일 혹은 폴더명 수정
  • 🔥 파일 혹은 폴더 삭제

✏️ 세부 설명 (선택)

유저의 role, userId, ip addr 수집

📷 스크린샷 (선택)

없음

✅ PR Checklist

PR이 다음 요구 사항을 충족하는지 확인하세요.

  • 커밋 메시지 컨벤션에 맞게 작성했습니다.
  • 변경 사항에 대한 테스트를 했습니다.(버그 수정/기능에 대한 테스트).

omegafrog added 5 commits May 15, 2025 11:12
로깅 서비스의 Gradle 설정 파일(.gitignore, .gitattributes, build.gradle, settings.gradle, gradle-wrapper 등)을 추가하여 기본 프로젝트 환경을 구성했습니다.
로깅 모듈을 main-server에 추가하고 build.gradle, settings.gradle, AppConfig에 관련 의존성과 설정을 반영함.
- 컨트롤러 실행 시 로그를 기록하는 AOP 클래스 `LoggingAop` 추가
- 로그 출력을 위한 어노테이션 `@ControllerLogging` 추가
- 컨트롤러 호출 메타데이터를 담는 `LogBody` 클래스 추가
- 결과 상태를 표현하는 `ResultStatus` enum 추가
- `EventController`에 `@ControllerLogging` 어노테이션 적용
- @ControllerLogging 어노테이션을 이용한 AOP 기반 로깅 기능 추가
- 각 Controller에 @ControllerLogging 어노테이션 적용
- 로그 데이터에 사용자 정보, IP 주소, 호출 결과 등을 포함하도록 개선
- logging 모듈 jar 빌드 설정 추가 및 main-server와 queue-server에 의존성 연동
- @BusinessLogging 어노테이션 추가 및 주요 비즈니스 메서드 로깅 기능 구현
- LogBody 클래스 수정: 메서드명, 클래스명 추가
- @ControllerLogging 어노테이션 수정: description 필드 추가
- UserController 주요 API 메서드에 @BusinessLogging 어노테이션 적용
- LoggingAop 리팩토링: 컨트롤러 로깅, 비즈니스 로깅 분리 및 로깅 개선
@omegafrog omegafrog self-assigned this May 15, 2025
@omegafrog omegafrog linked an issue May 15, 2025 that may be closed by this pull request
2 tasks
@omegafrog omegafrog added feat 기능 and removed chore labels May 15, 2025
@omegafrog
Copy link
Collaborator Author

어떤 정보를 수집해야 될지 잘 모르겠습니다.
맡으신 부분들 중에서 중요한 정보들을 알려주시면 도움이 될 거 같아요

@joungGo
Copy link
Collaborator

joungGo commented May 15, 2025

@omegafrog 스프링 부트의 log를 수집하는게 맞나요? 수집 목적이 어떻게 되나요?

@omegafrog
Copy link
Collaborator Author

운영상으로 중요한 정보나 주요 비즈니스 로직 실행을 남겨서 시스템 복구나 이런데 사용할 수 있게 하려고 합니다

@joungGo
Copy link
Collaborator

joungGo commented May 15, 2025

필수 로그 목록 (User 도메인)

1. UserService.java

회원가입 관련 로그

  • 클래스: UserService
  • 메서드: signup
  • 로그:
    • log.info(">> 회원가입 처리 시작: 이메일={}", request.getEmail())
    • log.info(">> 회원가입 완료: userId={}, email={}", savedUser.getUserId(), savedUser.getEmail())
    • log.warn(">> 회원가입 실패: 이메일 중복 - {}", request.getEmail())

로그인 관련 로그

  • 클래스: UserService
  • 메서드: login
  • 로그:
    • log.info(">> 로그인 서비스 호출: 이메일={}", request.getEmail())
    • log.info(">> 인증 성공: 이메일={}, userId={}", user.getEmail(), user.getUserId())
    • log.info(">> 토큰 생성 완료: 이메일={}", user.getEmail())
    • log.warn(">> 로그인 실패: 존재하지 않는 이메일 - {}", request.getEmail())
    • log.warn(">> 로그인 실패: 비활성화된 계정 - 이메일={}", request.getEmail())
    • log.warn(">> 로그인 실패: 잠긴 계정 - 이메일={}", request.getEmail())
    • log.warn(">> 로그인 실패: 만료된 비밀번호 - 이메일={}", request.getEmail())
    • log.warn(">> 로그인 실패: 잘못된 비밀번호 - 이메일={}", request.getEmail())

로그아웃 관련 로그

  • 클래스: UserService
  • 메서드: logout
  • 로그:
    • log.info(">> 로그아웃 서비스 호출")
    • log.info(">> RefreshToken에서 식별자 추출 성공: {}", identifier)
    • log.info(">> RefreshToken 삭제 완료: {}", identifier)
    • log.info(">> AccessToken 블랙리스트 처리 완료: 만료시간={}", expirationTime)
    • log.info(">> 로그아웃 처리 완료: 사용자={}", identifier)
    • log.error(">> 로그아웃 처리 실패: {}", e.getMessage(), e)

회원 탈퇴 관련 로그

  • 클래스: UserService
  • 메서드: withdrawUser
  • 로그:
    • log.info(">> 회원 탈퇴 처리 시작: identifier={}", identifier)
    • log.info(">> 일반 사용자 엔티티 삭제: userId={}, email={}", user.getUserId(), user.getEmail())
    • log.info(">> RefreshToken 삭제 완료: {}", tokenIdentifier)
    • log.info(">> AccessToken 블랙리스트 처리 완료: 만료시간={}", expirationTime)
    • log.info(">> 회원 탈퇴 처리 완료: identifier={}", tokenIdentifier)
    • log.error(">> 회원 탈퇴 처리 실패: {}", e.getMessage())

비밀번호 관리 로그

  • 클래스: UserService
  • 메서드: extendPasswordExpirationIfNeeded
  • 로그:
    • log.info(">> 비밀번호 만료일 연장: userId={}, email={}, newExpirationDate={}", user.getUserId(), user.getEmail(), user.getPasswordExpiredAt())

2. UserSchedulerService.java

계정 잠금 관리 로그

  • 클래스: UserSchedulerService
  • 메서드: autoUnlockAccounts
  • 로그:
    • log.info(">> 계정 잠금 자동 해제 작업 시작")
    • log.info(">> 계정 잠금 해제: userId={}, email={}", user.getUserId(), user.getEmail())
    • log.info(">> 계정 잠금 자동 해제 작업 완료")

비밀번호 만료 확인 로그

  • 클래스: UserSchedulerService
  • 메서드: checkExpiringPasswords
  • 로그:
    • log.info(">> 비밀번호 만료 확인 작업 시작")
    • log.info(">> 비밀번호 만료 예정 알림: userId={}, email={}, 만료일={}", user.getUserId(), user.getEmail(), user.getPasswordExpiredAt())
    • log.info(">> 비밀번호 만료 확인 작업 완료")

3. UserEmailService.java

이메일 발송 로그

  • 클래스: UserEmailService
  • 메서드: sendPasswordExpirationWarning
  • 로그:
    • log.info(">> 비밀번호 만료 예정 알림 이메일 발송 완료: email={}", user.getEmail())
    • log.error(">> 비밀번호 만료 예정 알림 이메일 발송 실패: email={}, error={}", user.getEmail(), e.getMessage(), e)

4. EmailService.java

이메일 인증 관련 로그

  • 클래스: EmailService
  • 메서드: createEmailForm, verifyEmailCode
  • 로그:
    • log.info("Generated auth code: {}", authCode)
    • log.info("Verifying code for email: {}, Input code: {}, Stored code: {}", email, code, codeFoundByEmail)

5. UserController.java

로그인 API 로그

  • 클래스: UserController
  • 메서드: login
  • 로그:
    • log.info(">> 로그인 시도: 이메일={}", request.getEmail())
    • log.info(">> 로그인 성공: 이메일={}, 토큰 발급 완료", request.getEmail())
    • log.info(">> 쿠키에 토큰 설정 완료")
    • log.warn(">> 로그인 요청 유효성 검증 실패: {}", bindingResult.getAllErrors())

로그아웃 API 로그

  • 클래스: UserController
  • 메서드: logout
  • 로그:
    • log.info(">> 로그아웃 요청 시작")
    • log.info(">> 헤더에서 액세스 토큰 추출: {}", accessToken)
    • log.info(">> 쿠키에서 액세스 토큰 추출: {}", accessToken)
    • log.info(">> 쿠키에서 리프레시 토큰 추출: {}", refreshToken)
    • log.info(">> 로그아웃 처리 성공")
    • log.info(">> 쿠키 삭제 완료")
    • log.warn(">> 토큰 추출 실패: accessToken={}, refreshToken={}", accessToken != null ? "있음" : "없음", refreshToken != null ? "있음" : "없음")

회원 탈퇴 API 로그

  • 클래스: UserController
  • 메서드: withdrawUser
  • 로그:
    • log.info(">> 회원 탈퇴 요청 시작")

@Emokido
Copy link
Collaborator

Emokido commented May 15, 2025

알림 기능별 로그 정보(Notification)

1. 알림 생성 관련 정보

클래스: NotificationService
메서드: createNotification
로그:
log.info(">> 알림 생성: userId={}, type={}, notificationId={}, content={}", userId, type, savedNotification.getId(), StringUtils.truncate(content, 100));

2. 알림 전송 상태 정보

클래스: NotificationEventService
메서드: handleNotificationCreatedEvent
로그:


log.info(">> 알림 전송 결과: userId={}, notificationId={}, status={}", userId, notificationId, status);
log.error(">> 알림 전송 실패: userId={}, notificationId={}, error={}", userId, notificationId, e.getMessage(), e);

3. SSE 연결 관련 정보

클래스: NotificationEmitterService
메서드: createEmitter, removeConnection
로그:

log.info(">> SSE 연결 생성: userId={}, connectionId={}", userId, connectionId);
log.info(">> SSE 연결 종료: userId={}, connectionId={}, 지속시간={}ms", userId, connectionId, connection.getConnectionDuration());
log.warn(">> SSE 연결 타임아웃: userId={}, connectionId={}", userId, connectionId);

4. 알림 읽음 상태 변경

클래스: NotificationService
메서드: getNotificationById
로그:

log.info(">> 알림 읽음 처리: userId={}, notificationId={}", userId, notificationId);

5. 알림 삭제 관련 정보

클래스: NotificationService
메서드: deleteNotification, deleteNotifications
로그:


log.info(">> 알림 삭제: userId={}, notificationId={}", userId, notificationId);
log.info(">> 다건 알림 삭제: userId={}, count={}", userId, notificationIds.size());

6. 성능 지표 관련 정보

클래스: NotificationService
메서드: getNotifications, getUnreadNotifications
로그:
log.debug(">> 알림 조회 성능: userId={}, 소요시간={}ms, 건수={}", userId, System.currentTimeMillis() - startTime, notifications.size());

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat 기능

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feat: 로그 개선

3 participants