728x90
반응형
728x90
반응형
728x90
반응형

로그를 별도로 관리,  logback에서 propreties 값 사용, logback으로 exception 기록

 

 

이번에 작업했던 내용은 변화가 많고 수시로 수정해야 하는 내용이 있는 기능 이었다.

그래서 매번 로컬에서 테스트 한다는 것은 현실성이 없었기 때문에 로컬환경과 같이 이클립스의 console창에 표시되는 정보를 운영서버에서도 바로바로 얻어 확인할 필요성이 있었다.

이런 상황에서 적당한 것이 logback 이다.

 

 

먼저 관리 페이지에 테스터를 만들었다.

그런데 console 창 로그를 가져오고 싶은데 어떻게 해야 할까?

서버에 기본으로 남기는 로그를 가져와야 하나?

기본으로 남기는 로그는 자칫 사막에서 바늘을 찾아야 하는 상황이 될 가능성이 크다.

필터링 해서 찾는 것도 뭔가 쓸데 없는 짓으로 느껴졌다.

 

혹시나 싶어 logback에 대해 알아보기로 했다.

기존에 나는 logback에서 로그를 어떤 것을 남길 것이냐, 어느 레벨로 남기냐 정도로 사용했다.

그런데 이번에 logback을 보면서 이외에 많은 부가적인 기능이 있음을 알게 되었다.

먼저 spring logback에 대한 자세한 정보는 구글에서 검색하자.

이미 많은 현자들께서 자세히 설명해 두셨다.

 

아래는 이번에 설정한 내용이다.

 

1. logback.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    
    <!-- 서버 환경별 properties를 읽기 위한 방법 -->
    <property resource="application.properties" />
    <property resource="application-${spring.profiles.active}.properties" />
    
    <!-- logging 패턴 정의 -->
    <appender name="INFO_LOG_OVER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${my.log.write.path}/${my.tester.log.file.name}.log</file>    <!-- 파일을 저장할 경로를 정한다 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch> <!-- 해당 레벨만 기록한다. -->
            <onMismatch>ACCEPT</onMismatch> <!-- DENY 다른 수준의 레벨은 기록하지 않는다.(상위 레벨도 기록 안함), ACCEPT : 상위 수준의 레벨에 대한 기록된다. -->
        </filter>     <!-- 레벨별 필터링이 필요없을 경우 filter class 관련된 부분을 삭제하면 됨-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>${my.log.write.path}/${my.tester.log.file.name}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>    <!-- 해당 패턴 네이밍으로 이전 파일이 기록됨 -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>     <!-- 한 파일의 최대 용량 -->
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>2</maxHistory> <!-- 한 파일의 최대 저장 기한 -->
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} - %msg %n</pattern>  <!-- 해당 패턴 네이밍으로 현재 로그가 기록됨 -->
        </encoder>
    </appender>
    
    <!-- name : 콘솔에 출력된 패키지 파일에서 남긴것 에 대해서 아래 작업을 실행한다. additivity : false는 로그 파일로만, true는 콘솔도-->
    <logger name="packagename.utils.DataUtil" additivity="true">
        <!-- INFO 레벨 이상에서만 실행한다. -->
        <level value="INFO"/>
        <appender-ref ref="INFO_LOG_OVER" />
    </logger>
    <logger name="packagename.admin.TesterService" additivity="true">
        <level value="INFO"/>
        <appender-ref ref="INFO_LOG_OVER" />
    </logger>
 
    <!-- 중략 -->
 
</configuration>
cs

4~6번줄 : 환경변수를 사용하기 위해 properties을 읽는다.

기본은 logback.properties 또는 application.properties에 logging.file.path, logging.file.name를 설정해서 사용하면 된다.

다만 나의 경우 로컬과 테스트, 운영 서버의 환경이 달라 패스가 달라지는데

이에 맞게 설정하려고 하니 logging.file.path, logging.file.name를 사용할 수 없었다.

그래서 4~6번줄과 같이 서버 환경에 따른 properties 파일의 값을 가져오는 방법을 사용했다.

(6번 라인의 spring.profiles.active를 모른다면 구글 검색)

 

환경별 properties 파일에 아래와 같이 설정값을 추가해 준다.

1
2
3
## logback 설정값
my.log.write.path=C:/logs
my.tester.log.file.name=tester
cs

logback.xml 내에서는 읽어온 변수값은 10번, 18번 줄과 같이 ${변수명}으로 사용하면 된다.

(주의! properties 파일에서 패스에서 역슬러시(\)는 사용할 수 없다)

 

9~27번줄 : 로그패턴을 정의한다.

10번줄 : 로그파일 패스와 파일명

18번줄 : 백업 파일 패스와 파일명

20번줄 : 1개 로그 파일의 최대 용량

22번줄 : 로그 보유기간(일)

 

30~38번줄 : 로그패턴을 어디서 어떻게 사용할 것인지 설정한다.

30번줄 : name은 로그패턴을 사용할 메소드의 패키지 위치, additivity는 false인 경우 지정한 로그파일로만 기록, true는 console(메인로그)도 기록

 

이제 지정된 패키지에서 남기는 로그가 별도로 기록되고 된다.

 

2. exception이 기록되지 않는다?

그런데 확인해 보니 1번 소스 30~38번줄에서 excetion이 일어났지만 로그파일에는 기록되지 않고 있었다.

logback의 설정이 필요한가? 검색해 봤는데 원인은 catch 문 안에서 로그를 표시하는 방법에 문제가 있었다.

1
2
3
4
5
6
try {
    ......
catch(Exception e) {
    // e.printStackTrace(); // logback으로 관리되지 않음
    logger.error("", e);
}
cs

 

이제 내가 계획한 대로 원하는 메소드에서 남기는 로그가 별도로 기록되게 되었다.

이렇게 남겨진 로그를 메소드 호출시간 부터 검색해서 찾아 테스터 화면에 뿌려주면 원하는 기능이 완성된다.

 

* 참고한 글

 

Logback 으로 쉽고 편리하게 로그 관리를 해볼까요? ⚙️

Spring Boot…

tecoble.techcourse.co.kr

 

Spring-boot Logback을 활용한 로그저장

📝Spring-boot의 로그를 파일로 저장해보자!!📌

velog.io

 

Dveamer

현실에서 살고 있지만 이상에 대한 꿈을 버리지 못한 몽상가의 홈페이지 입니다. 개인적인 기록을 주 목적으로 하며 일상과 프로그래밍 관련 글을 포스팅합니다.

dveamer.github.io

 

728x90
반응형

+ Recent posts