ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 Log4j 다루기
    Spring(스프링) 2016. 4. 13. 18:11

    ※ 해당 게시글은 DispatchServlet(Interceptor)을 통한 로그를 남기는 용도가 아닌 자바에서 사용하던 방식을 스프링 프로젝트에 구성한것을 토대로 작성하였음을 알려 드립니다




    자 항상 더 좋은? 개발자가 되기 위해서 노력하는것도 좋지만 사용하기 앞서 왜 사용하는지 그리고 내가 사용할려고하는것의 구조 및 핵심 내용을 알고 넘어가기 바란다.. 그렇다고 내 글이 어마어마한 도움을 주는 정도가 아니다.

    내가 알고 있는 정보를 공유하며 피드백을 받고 더불어 문제가 발생해서 어려움을 겪는 사람들에게 희망을 주고자 작성을 했다.



    우선 우리가 무심코 사용하는 System.out.println(); <- 호출되어 콘솔에 찍힐때 마다 CPU를 사용하게 됨으로 서버에 부하를 주게되는데.

    혼자 개발하는 경우 다소 괜찮지만 다중사용자를 처리해야 하는 웹에서는 정말 큰 문제를 만들게 된다.



    properties를 사용하는것을 자제하라는 글을 본적이 있는데... 왜 그런지는 아직 작성하는 시점에서는 모르겠다...(추후 알게되면 수정할 예정)
     

     

     

    스프링 프로젝트를 만들고 나면 log4j를 디폴트로 dependency에 추가해준다. 혹여나 없는 경우를 대비해서 확인후

     

     

     

     

    를 추가하기 바란다.

     

    추가가 완료되었다면 우리가 해당 글에서 다루고자 하는 Log4j에 대한 설정을 해보도록 하자

     

     

    Log4j 구조

     

    ① Logger(Category) : 로깅 메세지를 Appender에 전달합니다.

    ② Appender : 전달된 로깅 메세지를 파일에다 기록할 것인지, 콘솔에 출력할 것인지

                       아니면 DB에 저장할 것인지 매개체 역활을 합니다.

    ③ Layout : Appender가 어디에 출력할 것인지 결정했다면 어떤 형식으로 출력할 것이지

                    출력 layout을 결졍합니다.

     

     

     

    Log4j 로깅 레벨

     

     

     로그 레벨

    설명 

    fatal 

    아주 심각한 에러가 발생한 상태 

    error 

    요청을 처리하는 중 문제가 발생한 상태 

    warn 

    처리 가능한 문제, 향후 에러의 원인이 될 수 있는 경고 메세지 

    info 

    로그인, 상태 변경과 같은 정보 메세지 

    debug 

    개발 시 디버그 용도로 사용한 메세지 

    trace 

    신규 추가된 레벨로 디버그 레벨이 너무광범위한 것을 해결하기 위해서 좀 더 상세한 상태를 나타냄

     

     

    Log4j DatePattern

     형식

    설명 

    '.'yyyy-MM

    매달 시작 일에 로그 파일 변경 

    '.'yyyy-ww

    매주 시작 일에 로그 파일 변경 

     '.'yyyy-MM-dd

    매일 자정에 로그 파일 변경 

     '.'yyyy-MM-dd-a

    자정과 정오에 로그 파일 변경 

     '.'yyyy-MM-dd-HH 

    매 시간마다 로그 파일 변경 

     '.'yyyy-MM-dd-HH-mm

    매 분마다 로그 파일 변경 

     

    Log4j PatternLayout

     형식

    설명 

     %P

     debug, info, warn, error, fatal 등 priority 출력

     %m 

     로그 내용 출력 

    %d 

     발생 시간 출력  

    %t 

     발생 쓰레드의 이름 출력 

    %n 

     개행 문자 출력 

    %c 

     패키지 출력 / {숫자} 를 이용하여 단계별 출력, ex) %x{5} 

    %C 

     클래스 명 출력 / {숫자} 를 이용하여 단계별 출력, ex) %x{5}   

    %F 

     프로그램 파일 명 출력 

    %I 

     로깅이 발생한 caller 의 정보 출력 

    %L 

     로깅이 발생한 caller 의 라인 수 출력 

    %M 

     로깅이 발생한 method 명 출력 

    %r 

     애플리케이션 시작 이후 로깅이 발생한 시점의 시간 출력(millisecond) 

    %x 

     NDC 에 저장된 내용 출력 

    %X 

     MDC 에 저장된 내용 출력 

     

     

     

    위 기본 사항들을 파악하였다면 아래를 참고하기 바란다.!!

     

    (뛰어난? 개발자이거나 코더로 남고싶은 개발자라면 그냥 사용방법만 숙지해도 될꺼 같다.)

     

     

    스프링 프로젝트 기준으로 src/main/resources에  log4j.xml이라고 만들어져 있을것이다.

    찾았다면 해당 파일을 열어서 개발환경에 맞게 적용해보자

     

    맨처음? 이라고 하기도 머하지만 단지 에러를 기록하기 위한 목적이 아닌 모니터링을 하고 싶거나 디버그용도로 기록을 남기고 싶다면 콘솔로그를 사용해보기 바란다.

     

     

     

     

     

    에러 레벨이상의 로그를 남기는 부분에 대한 설정은 다음과 같다

     

    Append 가 false 일경우 톰캣이 내렸다 올라오는 순간 로그들이 리셋이 되어버린다는 것을 잊지말자!!

     

    추가적으로 Threshold 를 짚고 넘어가자면 Category 에 대해 알필요가 있다.

     

     

     

    Category여러개의 Appender를 첨부할 수 가 있는데, Category에서 설정된 priority 또는 level에 따라 Appender가 결정되면

    각 Appender는 다시 본인들의 Threshold 의 설정에 따라 로그 출력을 하게 된다.

     

    따라서 아래의 순서로 생각하면 된다.

     

    (1) 출력하고 로그파일을 분류한다.
    (2) 1번의 결과를 Appender로써 정의하고 필요한 로그레벨(Threshold)을 결정한다.
    (3) 소스파일의 패키지를 고려하여 category를 패키지별로 나누고 해당되는 Appender를 추가해나간다.
    이때 category의 priority는 설정된 Appender들중 가장 낮은 레벨을 설정해야한다.

     

     

     

     

     

    톰캣을 내렸다가 올렸을때 로그가 맨처음 두개가 찍히는 이유는 root 때문이다. 왜냐하면 최상위 로거로써 참조하고자 하는 대상이 설정되어있지 않다면

     

    log4j:WARN No appenders could be found for logger (org.apache.catalina.startup.TldConfig).
    log4j:WARN Please initialize the log4j system properly.

     

    라는 에러를 내뱉기 때문에 반드시 추가해줘야하는 대상이다.

     

     

    다들 알겠지만 특정 먼가가 좋다고 회사에 도입할순 없다 왜냐하면 장단점이 다 있기때문이다 . 시간이 지나면 지날수록 새로운 기술이 도입되고있는 세상이다.

    그러면 기존에 사용하던것의 단점을 보완을할텐데.... deprecated가 되는것도 한순간일것이다.

     

    말이 너무 길었으니.. 단점을 보도록 하자

     

     

     

     

     

     

     

Designed by Tistory.