Skip to content

Commit

Permalink
로그레벨, 포맷 1차버전 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
jojoldu committed Nov 12, 2024
1 parent c5d3d7d commit 0affba1
Showing 1 changed file with 55 additions and 25 deletions.
80 changes: 55 additions & 25 deletions posts/logging/좋은_logging/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
# 좋은 로깅 남기기

## 명확한 로깅 목표 세우기
다음 사항에 도움이 되는 로그 메시지를 작성한다.

- 시스템이 수행하는 작업을 추적합니다.
- 문제 발견 및 해결
- 보안 및 규칙 요구 사항 충족
- 시스템이 더 잘 작동하도록 만들기

## 모든 것을 기록하지 않기

Expand All @@ -10,48 +16,72 @@

표준 로그 수준(디버그, 정보, 경고, 오류)을 따르는 것이 좋다. 혼란스러울 수 있으므로 직접 구성하지 않는 것이 바람직하다.

##### 디버그 (Debug)
- 개발하는 동안 버그를 수정하기 위한 용도
- 앱이 활성화되면 이 기능을 꺼야 한다
**DEBUG**

##### 정보 (Info)
- 앱이 수행하는 작업을 추적한다
- 항상 가지고 다니기 좋은 수준이다
- **개발 혹은 테스트 단계**에서 해당 기능들이 올바르게 작동하는지 확인하기 위한 로그 레벨이다.
- 예를 들어 데이터베이스 연결이 생성되거나 해제되는 시점 혹은 함수 호출에 사용된 인자와 반환 값 등을 남겨서 개발 및 테스트 과정에서 문제를 추적하고 해결하는 데 도움을 주도록 한다.
- 요즘은 워낙 IDE의 디버거가 좋아져서 로컬 개발 단계에서는 활용할일이 적지만, Dev/QA 등 환경에서의 문제들을 파악해야할때 남기면 좋다.
- 본인이 여전히 `console.log` 혹은 `System.out.println` 으로 로컬에서 문제를 확인한다면 **IDE의 디버거를 필수로 익히고**, 그게 당장은 어렵다면 `log.debug`로 로그를 남기는 것을 추천한다.
- 다른 레벨들과 달리 **운영 환경에서는 남기고 싶지 않은 로그 메세지**를 위한 레벨이다.

##### 경고 (Warn)
- 이상한 일이 발생했지만 본격적인 문제는 아닌 경우
- 상황을 확인하기 위한 사전 준비와 같다
**INFO**

##### 오류 (Error)
- 심각한 문제의 경우
- 큰 문제를 해결하는 데 정말 중요하다
- 애플리케이션에서 **정상 작동에 대한 정보** 즉, 어떤 일이 발생했음을 나타내는 표준 로그 레벨
- 애플리케이션 상태, 설정 또는 외부 리소스와의 상호 작용과 같은 상태 확인을 위한 이벤트를 나타낸다.
- 예를 들어, 인증 API의 백엔드 시스템에서 **인증이 성공했는지 여부에 따라 사용자가 인증을 요청한 정보**`INFO` 레벨의 로그로 남긴다.
- 애플리케이션이 시작되거나 종료되는 시점, 중요한 작업이 완료되거나 실행되는 시점 (예: 배치 작업, 정기 작업) 등의 경우에도 남길 수 있다.
- `INFO` 로그는 **시스템을 파악하는데 유익한 정보**여야만 한다.
- 무의미한 정보를 남길 필요가 없다.
- 운영 환경에서도 사용할 수 있다.

#### 올바른 기본 로그 수준 선택
**WARN**

- 실행 중인 앱에는 정보 또는 경고 수준을 사용하는 것이 좋다.
- 디버그는 여전히 무언가를 만드는 작업을 할 때 유용하다.
- 애플리케이션에서 **잠재적으로 문제가 될 수 있는 상황**일때 남기는 로그 레벨
- 예를 들어 사용자가 로그인에 실패하는 것은 ID, PW 등을 오입력하여 **언제든 발생할 수 있는 일반적인 문제 상황**이다.
- 이럴때는 `WARN` 레벨로 책정하고, **로그인이 5번 연속 실패하는 등** 특정 기준치를 넘길 경우 `ERROR` 레벨로 남기는 것이 좋다.
- 이와 유사하게 예상치 못한 입력 (사용자가 유효하지 않은 입력을 제공한 경우 - 예: 이메일 형식이 아닌 입력), 리소스 제한 (파일 업로드 사이즈 초과 등)과 같은 경고를 기록할 수 있다.
- 이런 경우 **사용자에게 노출되는 메세지에 상세한 가이드가 필요한 것**이지, 로그 레벨이 ERROR일 필요가 없다.
- 이 레벨의 메세지는 개발자가 조치를 취할 수 있도록 주의를 기울일 필요가 있는 상황을 나타낸다.
- 운영 환경에서도 사용할 수 있다.

#### 필요에 따라 로그 수준 변경하기
**ERROR**

- 문제를 해결하려는 경우 디버그 수준을 켤 수도 있다.
- 정보가 너무 많을 때는 경고 또는 오류 수준으로 전환할 수 있다.
- 애플리케이션에서 발생한 **심각한 오류나 예외 상황**을 나타내는 로그 레벨
- 기능 자체가 제대로 작동하지 못하는 문제일때 남겨야 하며 **즉시 조치가 필요할때**를 의미한다.
- 예를 들어 데이터베이스 연결이 실패한 경우, 내부 시스템의 문제로 결제가 실패하는 경우 등일 경우엔 `ERROR`로 남기며 즉시 조치를 취해야 한다.
- 운영 환경에서도 사용할 수 있다.

#### 과도한 로그 기록 피하기

- 로그가 너무 많으면 작업 속도가 느려질 수 있다.
- 과도한 로그는 실제 문제를 파악하기 어렵게 만들 수도 있다.
좀 더 자세한 내용은 이전 글을 참고한다.

#### 개인 정보 보호
- [로그 레벨 구분하기](https://jojoldu.tistory.com/712)

- 개인 정보를 기록하지 않도록 주의해야 한다.
- 이를 통해 개인 정보 보호법을 준수할 수 있다.
## 로그 포맷 규칙 정하기

보통 다음과 같은 포맷을 사용한다.

## 로그 포맷 규칙 정하기
```java
2022-07-27 14:30:00 ERROR [USER-123] User login failed: wrong password
```

- 발생 시기
- 심각도
- 영향을 받는 대상
- 문제가 무엇인지

## 명확한 로그 메시지 작성하기


아래 내용이 포함되어야 한다.
- 오류 코드
- 이벤트 관련 중요정보
- 그 일이 일어난 시간
- 사용자 또는 시스템 ID
- 시스템이 무엇을 하고 있었는지

## 민감한 정보를 기록으로 남기지 않기



## 로거 잘 활용하기

Expand Down

0 comments on commit 0affba1

Please sign in to comment.