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로 하기

https://github.com/eomcs/eomcs-java-project-2021/blob/master/mini-pms-35-c-server/app/src/main/resources/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 자주 씀

좋은 웹페이지 즐겨찾기