이번 글에서는
Logging
에 대해 정리해 보려고 합니다.
운영 중인 애플리케이션에서 발생하는 정보를 기록하는 것을 말합니다.
보통 시스템 로딩
, HTTP 통신
, 예외
, 에러
등을 기록합니다.
Logging
은 운영 중인 애플리케이션에서 문제가 발생했을 때, 문제의 원인을 파악하기 위한 용도로 사용됩니다.
애플리케이션을 개발할 때 문제가 발생하면 디버깅을 통해 원인을 파악할 수 있습니다.
하지만 실제 운영 중인 애플리케이션과 같이 디버깅을 할 수 없는 상황에서는 문제의 원인을 파악하기 힘듭니다.
그렇기 때문에 실제 운영 중인 애플리케이션의 정보를 확인하기 위해서는 Logging을 사용해야 합니다.
Spring
은 SLF4J
라는 추상화 로깅 프레임워크를 제공합니다.
SLF4J
는 다음과 같은 구조로 이루어져 있습니다.
SLF4J
를 구현한 Log4j
, Logback
, Log4j2
가 있습니다.
SLF4J
는 인터페이스이기 때문에 단독으로 사용할 수 없고 구현체와 같이 사용해야 합니다.
의존성 역전 원칙
을 적용했기 때문에 애플리케이션단에서 SLF4J를 의존하면
구현체가 변경되더라도 코드는 변경되지 않기 때문에 쉽게 구현체를 변경할 수 있습니다.
@RestController
class LoggingController {
private val logger = LoggerFactory.getLogger(this::class.java)
@GetMapping("/log/error")
fun logError(): String {
logger.error("log error")
return "error"
}
...
}
Logging
과 System.out.println
의 차이점입니다.
public void println() {
newLine();
}
private void newLine() {
try {
synchronized (this) {
ensureOpen();
textOut.newLine();
...
그리고 System.out.println
내부에 synchronized
가 있기 때문에 여러 쓰레드에서 동시에 요청하면 응답 시간이 느려지게 됩니다.
그러므로 실제 서비스에서는 Logging 프레임워크를 사용하는 것이 좋습니다.
https://www.youtube.com/watch?v=1MD5xbwznlI
https://hudi.blog/do-not-use-system-out-println-for-logging/