반응형
📄 Log란?
서버 컴퓨터의 운영 단계에서 기록된 데이터를 출력한 후 별도로 저장을 하기 위해 System.out.println 대신에 사용하는 것입니다.
❓ System.out.println 대신에 Log를 사용하는 이유?
1. 로그 레벨(Log Levels) 제공
Log를 사용하면 로그를 단계(Levels) 별로 관리할 수 있습니다.
2. 로그 출력 관리
System.out.println은 콘솔에 출력됩니다.
하지만 Log의 경우에는 출력한 후 File로 별도로 저장하도록 설정하여 로그 파일을 날짜별, 용량별로 분할할 수 있습니다.
3. 성능 최적화
System.out.println보다 성능적으로 좋습니다.
4. 다양한 기능 제공
로그 포맷팅: 시간, 로그 레벨, PID(프로세스 ID), 쓰레드 정보, 클래스 정보 등을 조정할 수 있습니다.
로그 필터링: 특정 레벨 이상의 로그만 출력하거나, 특정 패키지의 로그를 제외할 수 있습니다.
📄 다양한 Log 선언 방법
- 순수 Java로 Log 선언
- @Slf4j 어노테이션으로 Log 선언
순수 JAVA로 Log 선언
@RestController
public class LogTestController {
//@Slf4j 어노테이션으로 Log 선언 시 생략 가능
private final Logger log = LoggerFactory.getLogger(getClass());
@RequestMapping("/log-test")
public String logTest(){
String name = "Spring";
System.out.println("name = " + name);
log.info(" info log={}", name);
return "ok";
}
}
결과 화면
@Slf4j 어노테이션으로 Log 선언
Lombok 라이브러리 추가 시 사용 가능
@Slf4j
@RestController
public class LogTestController {
@RequestMapping("/log-test")
public String logTest(){
String name = "Spring";
log.trace("trace log={}", name);
log.debug("debug log={}", name);
log.info(" info log={}", name);
log.warn(" warn log={}", name);
log.error(" error log={}", name);
return "ok";
}
}
결과 화면
참고: 순수 JAVA로 Log 선언 코드와 어노테이션으로 Log 선언 코드는 같은 코드입니다.
하지만 어노테이션을 사용할 시 DI 멤버 변수 선언을 생략할 수 있습니다.
참고: SLF4J 라이브러리는 인터페이스, 실제 구현체는 Logback입니다.
구현체의 종류는 Logback, Log4J, Log4J2 등등 수 많은 라이브러리가 있습니다.
📄 로그 레벨(Log Levels)의 종류
- trace: 매우 상세한 디버깅 정보
- debug: 디버깅을 위한 정보( 개발 단계 )
- info: 일반적인 실행 정보를 나타냄( 운영 단계 )
- warn: 주의가 필요한 상황
- error: 에러가 발생했을 때
- fatal: 심각한 오류로 인해 애플리케이션이 중단될 수 있는 상황
log.debug의 경우에는 개발 단계에 많이 사용 되며, log.info의 경우에는 실제 운영 단계에서 많이 사용됩니다.
참고: 사용자의 중요한 정보는 절대 Log에 기록하지 않습니다.
📄 로그 포맷팅
시간, 로그 레벨, PID(프로세스 ID), 쓰레드 정보, 클래스 정보 등을 조정할 수 있습니다.
[ 날짜 ] [ Log 레벨 ] [ PID ] --- [ 쓰레드 정보 ] 클래스 정보 : [ Log 출력물 ]
📄 필터링
개발 서버에서의 로그와 운영 서버에서의 로그를 상황에 맞게 조절할 수 있습니다.
또한 패키지 별로 로그 레벨을 다르게 설정할 수 있습니다.
application.properties
#전체 로그 레벨 설정(기본 info)
logging.level.root=info
#hello.springmvc 패키지와 그 하위 로그 레벨 설정
logging.level.hello.springmvc=trace
📄 올바른 Log 사용 방법
@Slf4j
@RestController
public class LogTestController {
// private final Logger log = LoggerFactory.getLogger(getClass());
@RequestMapping("/log-test")
public String logTest(){
String name = "Spring";
// 올바른 Log 사용 방법 🟢
log.info(" info log={}", name);
// 틀린 Log 사용 방법 ❌
log.info(" info log" + name);
return "ok";
}
}
참고: 로그 출력 레벨을 info로 설정해도 해당 코드에 있는 " info log=" + name이 실제 실행이 되어 버립니다.
결과적으로 + 연산이 발생하여 메모리의 낭비가 발생합니다.
따라서 로그를 출력할 때에는 log.info(" info log={}", name) 형식으로 사용해야합니다.
📄 변수 2개 이상 출력 방법
@Slf4j
@RestController
public class LogTestController {
// private final Logger log = LoggerFactory.getLogger(getClass());
@RequestMapping("/log-test")
public String logTest(){
String name = "Spring";
int age = 21;
log.info("name={}, age={}", name, age);
return "ok";
}
}
반응형
'JAVA & Spring' 카테고리의 다른 글
[ Spring ] @Autowired, @Resource, @Inject 차이점 아주 쉽게 정리 (1) | 2024.10.16 |
---|---|
[Spring Boot] Thymeleaf decoupled logic Config 등록 방법 (0) | 2024.04.01 |
[Spring Security] WebSecurityConfiguration 총정리 (0) | 2023.09.12 |
[JAVA] 마름모 출력 소스 코드 (0) | 2023.08.02 |
[Java / MySQL] 도서 관리 시스템 04 (MVC패턴)(마무리) (0) | 2023.02.04 |
댓글