Inflearn Community Q&A
7~8강 Log Level 관련 상세 설명/명세가 필요할 경우 log.info/warn <-> 주석의 적절한 사용 방법에 대한 질문
Written on
·
29
·
Edited
1
안녕하세요, 선생님!
log.info/log.warn 과 주석의 사용에 대해 선생님의 실무적 견해, 고견을 여쭤보고자 질문 드리게 되었습니다.
질문 내용은 아래와 같습니다.
만약 오픈소스나 실무에서 상세한 명세나 설명을 해야 한다면 log info, warn 및 주석 중에 어떤 것을 먼저 생각하는 것이 좋을지
프레임워크의 예시처럼 일단 모두 주석으로 작성하고, 특징적인 부분(?)만 log로 보여주는 것이 좋을지
7강과 8강 log level 관련한 내용을 들었는데, 제가 이해한 내용이 맞으면 선생님께서
log info의 경우 운영환경에서 기본적으로 사용하는 로그, 주요 흐름을 기억하기 위해 사용
log warn의 경우 현재는 문제가 안되지만 트래픽 규모가 늘어나는 등 이후에 응답시간 지연 및 오류 발생 등의 중대한 상황을 유발할 수 있을때 활용 가능
즉각적인 조치는 아니지만 이후 요구사항이 추가적으로 나타날 수 있기에 확장 가능성/보완이 필요할 경우 활용 가능
으로 이해하였습니다.
이 부분을 듣고 Spring Batch나 Tomcat 등의 프레임워크(라이브러리에 등록된 로직)에서 제공하는 주석이 생각났습니다.
이러한 프레임워크에서는 상세 설명/명세에 대한 부분은 모두 log.info/warn보다는 주석으로 처리하였던 부분을 떠올렸는데,
Spring Batch의 경우는 거의 대부분이 주석으로 상세 설명을 하였고,
물론 webMVC에서 tomcat이나 catalina를 실행하는 과정을 info로 보여주기는 했는데 핵심부분은 주석으로 모두 기재하여 보여주는 느낌이었습니다.
저의 부족한 식견일 수 있고, 말씀하신대로 팀의 정책이나 협의 과정에 의한 부분일 수 있겠지만,
추후 작은 규모의 오픈 소스 프로젝트 등을 시작할 생각도 있고, 이 강의를 기회로 실무에서 제대로 로그를 사용해보고자 하기에 선생님의 생각이 궁금하여 여쭤보고자 하였습니다.
패키지, 클래스의 상세한 설명은 주석으로 보여주고, 파라미터 등의 특징적인 부분(구체적으로 무엇을 log로 처리하는 것이 좋을지 몰라서 "특징적인 부분"으로 기재)만 보여지도록 log로 처리하면 될지 선생님의 고견을 참고해보고자 합니다!
감사합니다.
Quiz
Which log level provides the most detailed information about the code's execution path?
Info
Debug
Trace
Warning
Answer 1
1
안녕하세요! 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 응답이 평소보다 늦어지는 임계치 도달시 남기는 것을 추천드립니다..!
이것 저것 말씀드리다 보니 답변이 길어졌네요,,! 제 답변이 도움이 되셨을지 모르겠습니다!
근데 다만 확실한건 제가 강의에서도 말씀드렸지만 전적으로 이런건 정답은 없고 프로젝트의 상황과 규모를 토대로 잘 판단하신다면 그게 정답입니다! ㅎㅎ 여러가지 적용 해보시면서 적절한 트레이드 오프를 하시면 좋을 것 같습니다! ㅎㅎ
강의 열심히 들어주셔서 감사하고, 추후에 질문 사항이 또 생긴다면 언제든 남겨주시길 바랍니다! ㅎㅎ
항상 응원하겠습니다~!!





자세한 답변 너무나도 감사드립니다!
확실히 생각없이 로그, 주석을 썼는데 유지보수와 운영관점에서 다시 생각하게 되는 것 같습니다.
추가적으로 한가지 더 질문 드리고자 합니다.
MDCLoggingFilter과 traceId를 사용해서 Monolithic에서도 JMeter처럼 트랜잭션 추적이 가능할까 싶었는데, 아래 사진과 같이 mdc filter를 적용받지 않는 곳에서는 trace id가 출력되지 않는 것을 확인하였습니다(JDBC 연결이 되지 않을 경우 Hibernate 측에서 오류 로그를 내뱉지만 trace id를 출력하지 않음).
분산 환경에서 전체적인 트랜잭션 흐름을 추적할때 traceId나 spanId를 통해 유용하게 사용하였는데, Monolithic에서 이러한 JMeter 사용을 위한 actuator 의존성 추가 없이 간편하게 사용할 수 있을 것으로 기대했는데, 위 경우처럼 다소 제한적인 범위에서만 사용 가능할 것 처럼 보였습니다(챗지피티에게 물어보니 mdcloggingfilter를 적용하더라도, hibernate, jdbc처럼 필터를 사용하는 주체가 바뀌면 traceid를 출력하지 않는다고 답변).
말씀하신대로 이러한 추적을 위해 식별자를 사용해야 할텐데, mdcloggingfilter의 traceId로는 부족할까요? 아니면 굳이 mdcloggingfilter를 사용하지 않고도 기본 설정의 로그만으로 충분히 추적이 가능할까요? 어쩔 수 없이 의존성을 추가해야 할지, 선생님의 고견을 여쭤보고자 합니다.
강의를 듣고 난 후 가독성이 좋은 식별자를 사용할 수 있을 것으로 기대했는데, 실무에서 mdcLoggingFilter를 사용한적이 없어 올바른 사용법이나 적용 범위가 맞는지 선생님의 의견을 여쭤보게 되었습니다.
감사합니다.