2022-04-06(수)
21.1 Log4j 적용하기
실행 여부 확인
프로그램이 잘 실행되는지 문제가 발생하면 어디서 발생했는지 추적
Log4j
spring boot log4j 검색
https://huisam.tistory.com/entry/log4j2
스프링 부트의 기본 로그 라이브러리를 제거한다
configurations {
all {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}
gradle cleanEclipse
gradle eclipse
https://docs.spring.io/spring-boot/docs/2.6.6/reference/htmlsingle/#using.build-systems.starters
log4j2 스프링부트 라이브러리를 추가한다
implementation 'org.springframework.boot:spring-boot-starter-log4j2'
gradle eclipse
3단계 - log4j2 설정 파일을 생성한다
루트 폴더에 둬야 한다
파일명은 무조건 log4j2.xml
로 하기
4단계 - 스프링부트 설정 파일에 log4j2 설정 파일의 경로를 지정한다.
logging.config=classpath:log4j2.xml
sql문이 나온다
로그인해서 게시물 등록해보기
너무 자세하게 나오니까 로깅 레벨을 낮추겠다
<PatternLayout
pattern="[%-5level] %d{yyyy-MM-dd} [%t] %c{1} - %msg%n" />
%t : 스레드 이름
%c : 클래스 이름. 패키지 이름을 제외한 마지막 이름.
%n : 줄바꿈 기호
<RollingFile>
: 파일로 출력
<Root>
: 모든 실행에 공통적으로 적용
log4j2 doctype 검색
태그에 쓸 수 있는 게 무엇이 있는지 정보가 있음
<Logger name="com.eomcs.mylist" level="debug">
<AppenderRef ref="stdout" />
</Logger>
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
Logger log = LogManager.getLogger(BoardController.class);
로그를 남길 때 BoardController 클래스 이름으로 로그를 남긴다는 거
하나의 객체를 쓰면 돼서 static 붙이기
무조건 log 객체는 한 번만 만들어진다
// log를 출력하는 도구 준비
private static final Logger log = LogManager.getLogger(BoardController.class);
@RequestMapping("/board/list")
public Object list() {
log.fatal("fatal...");
log.error("error...");
log.warn("warn...");
log.info("info...");
log.debug("debug...");
log.trace("trace...");
return new ResultMap().setStatus(SUCCESS).setData(boardService.list());
}
Log4j2 레벨
fatal -> 더이상 실행이 불가능한 오류가 발생했을 때, 서버 재실행이 필요한 경우
error -> 실행 중 오류 발생 했을 때
warn -> 실행하는데는 문제가 없지만 장기적으로 문제를 일으킬 가능성이 있을 때
다른 오류의 원인이 될 수 있는 상황
info -> 실행 흐름을 기록하고 싶을 때
debug -> 개발하는 동안 참조할 정보
trace -> 시스템 상태를 세세하게 기록
운영자가 봐야할 정보
개발자가 봐야할 정보
시스템을 멈추는 상황이 발생할 때 개발자와 운영자 모두 확인해야 하는 정보
Log4j 레벨에 따른 출력 범위
<Logger name="com.eomcs.mylist" level="error">
<AppenderRef ref="stdout" />
</Logger>
<Logger name="com.eomcs.mylist" level="info">
<AppenderRef ref="stdout" />
</Logger>
<Logger name="com.eomcs.mylist" level="debug">
<AppenderRef ref="stdout" />
</Logger>
개발자가 봐야할 정보
설정파일에서 레벨만 변경하면 됨
각각 설정도 가능
<Logger name="com.eomcs.mylist">
<AppenderRef ref="stdout" level="error"/>
<AppenderRef ref="file" level="info"/>
</Logger>
개발하는 동안에는 debug로 설정하기. SQL문까지 출력됨.
<Logger name="com.eomcs.mylist" level="debug">
<AppenderRef ref="stdout" />
</Logger>
지금부터 println() 쓰지 말기
@RequestMapping("/board/list")
public Object list() {
log.debug("게시물 목록 조회!");
return new ResultMap().setStatus(SUCCESS).setData(boardService.list());
}
@RequestMapping("/board/add")
public Object add(Board board, HttpSession session) {
log.info("게시물 등록!"); // 개발이 끝나고 여기까지만 출력
log.debug(board); // 개발하는 동안
// System.out.println("BoardController.add() 호출됨!");
Member member = (Member) session.getAttribute("loginUser");
board.setWriter(member);
boardService.add(board);
return new ResultMap().setStatus(SUCCESS);
}
log.trace() 하면 level="trace"라고 해야 출력됨
<Logger name="com.eomcs.mylist" level="debug">
<AppenderRef ref="stdout" />
</Logger>
<Root level="info">
<AppenderRef ref="stdout" />
</Root>
실행한 SQL문이 무엇이고 넘어간 파라미터 값이 무엇인지 알 수 있다.
error, info, debug 자주 씀
Author And Source
이 문제에 관하여(2022-04-06(수)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@banana/2022-04-06수저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)