inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Quản lý log và giám sát - ELK, Prometheus, Grafana

Các cấp độ của log - TRACE, DEBUG, INFO, WARN, ERROR, FATAL

7~8강 Log Level 관련 상세 설명/명세가 필요할 경우 log.info/warn <-> 주석의 적절한 사용 방법에 대한 질문

42

Hyo Kyun Lee

11 câu hỏi đã được viết

1

안녕하세요, 선생님!

 

log.info/log.warn 과 주석의 사용에 대해 선생님의 실무적 견해, 고견을 여쭤보고자 질문 드리게 되었습니다.

 

질문 내용은 아래와 같습니다.

 

7강과 8강 log level 관련한 내용을 들었는데, 제가 이해한 내용이 맞으면 선생님께서

 

으로 이해하였습니다.

 

이 부분을 듣고 Spring Batch나 Tomcat 등의 프레임워크(라이브러리에 등록된 로직)에서 제공하는 주석이 생각났습니다.

 

이러한 프레임워크에서는 상세 설명/명세에 대한 부분은 모두 log.info/warn보다는 주석으로 처리하였던 부분을 떠올렸는데,

 

Spring Batch의 경우는 거의 대부분이 주석으로 상세 설명을 하였고,

물론 webMVC에서 tomcat이나 catalina를 실행하는 과정을 info로 보여주기는 했는데 핵심부분은 주석으로 모두 기재하여 보여주는 느낌이었습니다.

 

저의 부족한 식견일 수 있고, 말씀하신대로 팀의 정책이나 협의 과정에 의한 부분일 수 있겠지만,

 

추후 작은 규모의 오픈 소스 프로젝트 등을 시작할 생각도 있고, 이 강의를 기회로 실무에서 제대로 로그를 사용해보고자 하기에 선생님의 생각이 궁금하여 여쭤보고자 하였습니다.

 

패키지, 클래스의 상세한 설명은 주석으로 보여주고, 파라미터 등의 특징적인 부분(구체적으로 무엇을 log로 처리하는 것이 좋을지 몰라서 "특징적인 부분"으로 기재)만 보여지도록 log로 처리하면 될지 선생님의 고견을 참고해보고자 합니다!

 

감사합니다.

 

elasticsearch logstash Kibana prometheus grafana

Câu trả lời 1

1

synee

안녕하세요! Hyo Kyun Lee님~ JSCODE 시니 입니다! ㅎㅎ

강의 내용을 아주 깊이 있게 소화하고 계시네요! 질문 주신 내용은 실무에서 개발자가 늘 고민하게 되는 가독성(코드)과 가시성(운영) 사이의 균형에 대한 아주 훌륭한 주제인 것 같습니다! ㅎㅎ

말씀하신 것처럼 프로젝트의 성향이나 규모에 따라 천차만별이긴 하겠지만,,, 질문하신 내용에 대해 제 실무적 경험을 바탕으로 정리해드릴게요!

 

1. 주석과 로그의 본질적인 차이

제가 생각할때 주석과 로그의 본질척인 차이를 두기 위해 가장먼저 구분해야 할 것은 '누가, 언제 읽는가' 인 것 같습니다!

  • 주석 : 개발자가 코드를 수정하거나, 기능을 파악하기 위해 코드 편집툴에서 읽는 것 입니다. 비즈니스 로직의 의도나 복잡한 알고리즘 설명, 오픈소스 사용법등이 여기에 포함됩니다.

  • 로그 : 운영자가 애플리케이션이 실행 중일 때 콘솔이나 파일을 통해 읽는 것 입니다. 프로그램의 상태를 확인하는 용도라고 생각하시면 쉬울 것 같습니다!


2.상세 명세와 설명은 어떤 영역일까?

결론부터 말씀드리면, '상세한 명세와 설명은 100% 주석의 영역 ' 입니다.

오픈 소스나 프레임워크(Spring Batch, Tomcat 등)에서 로그를 상세하게 남기지 않는 이유는 크게 두가지입니다..!

  • 성능 저하 : 상세한 설명을 모두 로그로 세세하게 남기면 디스크 I/O 가 발생하여 전체 시스템 성능이 크게 떨어집니다!

  • 로그 노이즈 : 너무 많은 정보가 로그에 찍히면, 정작 장애가 났을 때 중요한 로그를 찾기가 불가능해질 수 있습니다.

그래서 결론적으로는 저는 클래스나 메서드의 역할을 설명하실때는 주석으로 작성하는걸 추천 드립니다. 특히 이때 작성하시는 주석은 일반 주석 보다는 /** 내용 */ 주석으로 작성하시는걸 추천드립니다! ㅎㅎ

만약 로그로 남겨야 할 특징적인 부분이 뭘까 라고 한다면,, 어떤 데이터가 들어와서 어떤 결과가 나갔는지에 대한 상태의 변화라고 생각합니다..!


3.Log Info와 Warn의 실무적 활용 가이드

우선 강의에서 이해하신 내용이 아주 정확합니다! ㅎㅎ 이를 실무/오픈소스 관점에서 조금 더 구체화 해볼게요..!

  • Log INFO : 실행되는 로직의 핵심단계만 남기시면됩니다.
    예를들어, log.info("이제부터 사용자 유효성 검사를 시작하고 디비에 저장 한 뒤~~ 어쩌고 저쩌고") 이런 내용은 로그 보다는 주석으로 가는것이 훨씬 알맞겠죠!
    대신 좋은 예시는 log.info("배치 작업 xxx 시작 : [TargetDate : {}]", targetDate);
    이런식으로 이 작업이 시작이 됐고 성공적으로 끝났다는 사실 여부 같은걸 쓰면 좋습니다. 참고로 식별자를 남기는 것이 핵심입니다! ㅎㅎ

  • Log WARN : 시스템이 중단되지는 않지만, 나중에 문제가 될 요소를 남깁니다.


    예를들어 오픈소스라면 설정값이 권장 사양보다 낮을때나, 곧 사라질 기능을 호출 했을때 남기면 좋을 것 같습니다.


    또는, 재시도 로직 중 1차 실패 발생시나, api 응답이 평소보다 늦어지는 임계치 도달시 남기는 것을 추천드립니다..!

     

이것 저것 말씀드리다 보니 답변이 길어졌네요,,! 제 답변이 도움이 되셨을지 모르겠습니다!

근데 다만 확실한건 제가 강의에서도 말씀드렸지만 전적으로 이런건 정답은 없고 프로젝트의 상황과 규모를 토대로 잘 판단하신다면 그게 정답입니다! ㅎㅎ 여러가지 적용 해보시면서 적절한 트레이드 오프를 하시면 좋을 것 같습니다! ㅎㅎ

강의 열심히 들어주셔서 감사하고, 추후에 질문 사항이 또 생긴다면 언제든 남겨주시길 바랍니다! ㅎㅎ

항상 응원하겠습니다~!!




 

 

0

Hyo Kyun Lee

자세한 답변 너무나도 감사드립니다!

 

확실히 생각없이 로그, 주석을 썼는데 유지보수와 운영관점에서 다시 생각하게 되는 것 같습니다.

추가적으로 한가지 더 질문 드리고자 합니다.

 

MDCLoggingFilter과 traceId를 사용해서 Monolithic에서도 JMeter처럼 트랜잭션 추적이 가능할까 싶었는데, 아래 사진과 같이 mdc filter를 적용받지 않는 곳에서는 trace id가 출력되지 않는 것을 확인하였습니다(JDBC 연결이 되지 않을 경우 Hibernate 측에서 오류 로그를 내뱉지만 trace id를 출력하지 않음).

{C4B97D32-CF78-45D8-A8B0-5D852FE13303}.png

 

분산 환경에서 전체적인 트랜잭션 흐름을 추적할때 traceId나 spanId를 통해 유용하게 사용하였는데, Monolithic에서 이러한 JMeter 사용을 위한 actuator 의존성 추가 없이 간편하게 사용할 수 있을 것으로 기대했는데, 위 경우처럼 다소 제한적인 범위에서만 사용 가능할 것 처럼 보였습니다(챗지피티에게 물어보니 mdcloggingfilter를 적용하더라도, hibernate, jdbc처럼 필터를 사용하는 주체가 바뀌면 traceid를 출력하지 않는다고 답변).

 

말씀하신대로 이러한 추적을 위해 식별자를 사용해야 할텐데, mdcloggingfilter의 traceId로는 부족할까요? 아니면 굳이 mdcloggingfilter를 사용하지 않고도 기본 설정의 로그만으로 충분히 추적이 가능할까요? 어쩔 수 없이 의존성을 추가해야 할지, 선생님의 고견을 여쭤보고자 합니다.

 

강의를 듣고 난 후 가독성이 좋은 식별자를 사용할 수 있을 것으로 기대했는데, 실무에서 mdcLoggingFilter를 사용한적이 없어 올바른 사용법이나 적용 범위가 맞는지 선생님의 의견을 여쭤보게 되었습니다.

 

감사합니다.

 

강의에 적용한 스크립트를 받아 볼수 있을까요?

0

27

2

멀티 필드 실무 질문드립니다.

0

38

1

페이지네이션 질문드립니다.

0

38

3

actuator에서 health 외의 다른 URL은 404 Notfound 에러가 발생합니다.

0

44

2

insert , upsert 질문드립니다.

0

40

2

마이크로미터는 별도 설정이 없어도 되나요?

0

60

1

수업노트 오타 수정

0

73

1

10051을 열고 10050은 열지 않는 이유가 궁금합니다.

0

104

2

logstash 파이프라인 설정

0

56

1

보안이 엄격한 데이터

0

71

1

MyProperties 자체를 클라이언트 코드에서 사용

1

42

1

http://localhost:8080/actuator/prometheus

0

84

3

Grafana에서 Loki를 통해 대시보드를 만들 때 어떤 로그를 보는 게 좋은 지 궁금합니다

0

110

1

postgres 수업중 case 함수 스크립트 자료

0

47

1

jar 추가에대한 질문드려도될까요?

0

62

1

profile을 "dev"로 실행했을 때 pod 오류

1

64

3

build.gradle bom link 변경

0

63

2

discover> create data view 하는데 다른화면 나옵니다.

1

56

2

[프로메테우스] Error scraping target: server returned HTTP status 404

1

78

3

강의 pdf는 따로 제공안해주시는 건가요?

0

43

1

@Counted 초기화

0

47

1

안녕하세요 질문 있습니다.

0

79

2

그라파나 화면 관련하여 궁금한게 있습니다.

0

101

2

그라파나에 뜨는 화면 관련해서 질문 있습니다

1

88

2