백엔드 서버에서 로그가 필요한 이유는 여러 가지가 있다. 로그는 서버의 동작 상태를 기록하고 모니터링하는 중요한 도구로서 다음과 같은 목적을 가지고 있다.
애플리케이션에 문제가 발생했을 때, 로그를 통해 오류의 원인을 파악하고 수정할 수 있다. 로그 없이 문제가 발생한 상황을 그대로 재현하기는 힘들기 때문에, 로그는 코드에서 발생하는 예외, 오류 메시지, 경고 등을 기록하여 문제 해결에 도움을 준다.
서버의 성능을 모니터링하기 위해 로그를 사용한다. 응답 시간, 처리 시간, 데이터베이스 쿼리 시간 등을 기록하여 병목 현상을 파악하고 성능을 개선할 수 있다.
보안 관련 이벤트를 기록하여 서버의 보안 상태를 모니터링한다. 예를 들어, 로그인 시도, 권한 없는 접근 시도, 데이터 유출 등 보안 위협을 감지하고 대응할 수 있다.
사용자의 활동을 추적하여 사용 패턴을 분석할 수 있다. 이는 사용자 경험을 개선하고 애플리케이션의 기능을 향상시키는 데 도움이 된다.
서버의 상태와 운영 상황을 실시간으로 모니터링하여 문제가 발생하기 전에 예방할 수 있다. 서버의 시작, 중지, 재시작 이벤트와 시스템 자원 사용량 등을 기록한다.
감사 로그는 서버에서 발생한 모든 중요한 이벤트를 기록하여 나중에 감사 또는 분석할 수 있게 한다. 특히 외부 결제 API 같은 중요한 이벤트를 연동할 때 더욱 중요하게 작용한다. 결제의 정합성이 틀어지거나, 결제 API의 요청 횟수 분석 같은 경우에 필수적이다. 이러한 로그를 DB에 저장하여 특정 상황을 확인하기 위한 것도 있다.
따라서 로그는 백엔드 서버 운영에 필수적인 요소로서, 서버의 안정성과 보안성을 유지하고, 사용자 경험을 개선하는 데 중요한 역할을 한다.
Spring에서는 여러 로깅 프레임워크를 지원하며, 사용되는 로깅 프레임워크는 SLF4J, Logback가 있다.
Spring에서 로그는 아래와 같이 사용할 수 있다.
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
Spring Bean이나 일반 클래스에서 SLF4J 로거를 사용하여 로그를 기록할 수 있다.
@RestController
public class LogController {
private final Logger log = LoggerFactory.getLogger(LogController.class);
public LogController() {}
@GetMapping("/log-test")
public ResponseEntity<Void> test(){
log.error("It's a log test");
return ResponseEntity.ok().build();
}
}
해당 실행 시, 로그가 STDOUT으로 보여지게 된다.
로거는 여러 가지 로그 레벨을 지원합니다. 각 로그 레벨은 중요도에 따라 다르다.
logging:
level:
org:
hibernate:
type:
descriptor:
sql:
BasicBinder: DEBUG
org.springframework.orm: DEBUG
org.springframework.transaction: DEBUG
위 설정은 Hibernate의 SQL 바인딩, Spring의 ORM, 그리고 트랜잭션 관리와 관련된 로그를 상세히 출력하도록 설정한다. 이를 통해 개발자는 애플리케이션의 데이터베이스 상호작용과 트랜잭션 처리 과정을 자세히 추적하고 문제를 디버깅할 수 있다. 로그 레벨을 DEBUG로 설정함으로써, 이들 패키지와 클래스에서 발생하는 많은 양의 로그 정보를 얻을 수 있다.