프로그램 개발이나 운영 시 발생하는 문제점을 추적하거나 운영 상태를 모니터링하기 위해 작성하는 텍스트를 로그라고 해요. 그리고 이를 남기도록 시스템을 만드는 것을 로깅이라고 하죠.
운영 중인 웹 어플리케이션에 문제가 발생했을 경우, 그 문제의 원인을 파악하려면 문제가 발생했을 때 당시의 정보가 필요해요. 그러기 위해서 예외가 발생하거나, 중요 기능이 실행되는 부분에 적절한 로그를 남기는 것이고 이는 빠르고 효율적인 문제 해결을 위해서 굉장히 중요한 과정이겠죠?
또한, logback 공식 사이트에서는 로깅의 비중이 코드의 4% 정도를 차지한다고 해요. 코드 수 자체만봤을 때도 상당한 비중을 차지하고 있다고 할 수 있겠네요.
근데 이런 의문이 들 수가 있어요.
그러게요. 왜 안될까요? 누구든 개발언어를 처음 배울 때, System.out.println(); 혹은 console.log(), print() 와 같이 Console 창에 원하는 내용을 찍어보게 될 거에요. 그리고 그 때부터 로깅을 정확히 이해하기 전까지 System.out.println()을 통해 직접 짠 로직이 잘 동작하는지를 확인할 거에요. 물론 저도 그랬고요.
하지만 이건 로그를 남기는 적절한 방식이 아니에요.
왜냐하면 로그는 운영 중인 웹 애플리케이션에 문제가 생겼을 때, 문제 해결을 위해 남기는 당시의 기록인데 그렇게 쓰기에 System.out은 충분한 정보를 담고 있지 않아요.
또한, 아래를 보면 println을 찍을 때 synchronized 라는 단어가 붙어있는 것을 볼 수가 있어요. 즉, System.out을 처리하는동안 다른 Thread가 Block 이 걸리게 되고, 이러한 현상이 많아진다면 성능저하의 원인이 될 수 있다는 말이죠.
System.out.println();
---------------------------------------------------
public void println() {
newLine();
}
---------------------------------------------------
private void newLine() {
try {
synchronized (this) {
ensureOpen();
textOut.newLine();
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush)
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
Logging Framework 중 Logback은 5단계의 로그 레벨을 가져요.
심각도 수준은 Error > Warn > Info > Debug > Trace 순이에요.
Error : 예상치 못한 심각한 문제일 경우. 즉시 조치가 필요한 레벨.
Warn : 에러는 아님. 당장의 서비스 운영에는 영향이 없으나, 주의가 필요.
Info : 운영에 참고할만한 사항.
Debug : 개발 단계에서 사용. 일반 정보를 상세하게 나타낼 때 사용.
Trace : 경로 추적을 위해 사용. 개발 단계에서 사용.
그럼, 다음 시간에는 slf4j와 logback에 대해 알아보도록 할게요!