프로그램 개발을 할 때 중요한 요소 중 한 부분은 바로 Logging 처리입니다.
많은 Logging Framework 중에서 어떤 것을 사용하고 각 Log Level을 어떤 게 설정할지를 진행하기 앞서서 프로젝트를 진행하기 앞서서 결정을 해야 합니다.
그럼 최근 읽고 있는 자바 성능 튜닝 이야기책을 통해 알게 된 Log4j, Logback 등에 Logging Framework 들을 직접 프로젝트를 선택하여 적용, 진행할 경우가 좋은지를 Logging과 Logging Framework에 특징을 알아본 후 이들 중 각각의 성능을 비교해보도록 하겠습니다.
시스템 동작 시 시스템 상태/작동 정보를 시간의 경과에 따라 기록하는 것을 logging이라 하며
그 기록들을 log라고 합니다.
일반적으로 처음 프로그래밍을 배울 때는 보통 System.out.print 같은 언어에서 제공해주는 메소드를 사용해보셨을 것입니다. 프로그램이 실행되면서 콘솔에 무엇인가가 출력되는데, 이런 것들이 로그가 될 수 있습니다.
System.out.println() 대신 logging을 사용하는 이유
- System.out.println() 명령어는 I/O Resource를 많이 사용하여 시스템이 느려질 수 있습니다.
- 로그를 파일로 저장하여 분석할 필요가 있기 때문에 사용합니다.
각각의 특징들을 비교 후 Log4j는 더 이상 지원하지 않는 부분과 나머지 두 개의 로깅 프레임워크보다는 성능상 떨어진다고 판단하여 제외했습니다.
그렇다면 둘 중 어떤 것을 선택해야 할까요? 정답은 없지만 제가 집중했던 부분은 성능이었습니다. 아무래도 대용량의 트래픽을 처리하는 서비스를 생각하고 있음으로 실제 서비스 로직 이외의 부분들은 최소한의 부담을 주기 위함입니다. Logback과 Log4j2를 성능 면에서 좀 더 자세히 살펴보도록 하겠습니다.
우선 로깅 프레임워크의 성능을 평가하기 위해 몇 가지 용어들을 이해할 필요가 있습니다.
응답 시간 : 메시지를 기록하는데 걸리는 총 시간 (서비스 시간 + 대기 시간)
서비스 시간 : 메시지를 기록하기 위해 걸리는 시간
대기 시간 : 서비스를 시작하기 전 요청이 대기열에서 대기 중인 시간
보통은 응답 시간이 늘어나면 서비스 시간이 원인으로 생각하지만, 실질적으로 보면 작업량이 늘어남에 따라 서비스 시간은 거의 변한 지 않는 경우가 대부분이지만 대기 시간은 서비스 시간에 몇 배까지 늘어나는 경우가 있습니다.
즉 응답 시간은 서비스 시간보다 대기 시간에 영향이 크다는 것을 알 수 있습니다.
우선 비동기 로깅 - 최대 처리량 비교입니다.
그림과 같이 스레드가 증가할 수록 Log4j2에 성능이 Logback을 압도하는 것을 알 수 있습니다.
또한 4개에 스레드를 동시에 로깅 시키는 고정된 환경 테스트에서도 최고의 응답 시간 동작을 보였습니다.
그리고 앞선과 다른 동기식 과정에서도 짧은 응답 시간을 확인 할 수 있습니다.