본문 바로가기
IT, 개발/JAVA

Logback 설정 파일 경로 지정 logback.xml 위치 변경

by 개발자스터디 2022. 2. 7.
반응형

 

 

 

 

 

Logback dynamic reloading에 대해..


프로그램을 개발하고 배포할 때 log출력 및 관리는 필수적으로 했던 것 같습니다.
프로그램의 상태가 정삭적으로 작동하고 있는지, 오류 발생 시 어디가 문제인지 확인하기 위함이 가장 큰 이유였고 저는 Logback을 주로 사용하였습니다.

항상 하던 데로 프로그램에 로그 출력을 위해 Logback을 사용하여 로그 관리를 하려고 했습니다.
저는 설정 파일을 xml로 작성하여 관리하고 있었고, Logback이 xml 설정 파일을 스스로 classpath에서 찾기 때문에 개발 시 해당 경로에 설정 파일을 생성하고 코드를 작성하여 사용하고 있었습니다.


여기서 문제가 발생했습니다.

평소 웹 프로젝트로 tomact 연동하여 사용할 때에는 "logback.xml" 설정 파일을 tomcat 실행 중에 변경하는 것이 아무 문제가 없었습니다. 프로젝트를 war파일로 export 하고 tomcat에 이동시켜서 실행하면 알아서 war파일이 풀리고 그 안에서 "logback.xml" 파일을 수정하고 재실행하면 끝이기 때문입니다.
그런데 이번에는 프로젝트를 jar파일로 export 하여 실행하다 보니 수정하고 싶은 "logback.xml" 설정 파일이 jar안에 있어서 프로그램 실행 도중 설정 파일을 변경할 수 없었습니다.

프로그램 실행 중에 설정 파일을 변경하려고 했던 이유는 크게 두 가지였습니다.

1. 로그 레벨 변경
2. 로그파일 생성 경로 변경
(이 외 다른 설정도 원하면 변경할 수 있도록 하기 위함)

 

그래서 jar와 설정 파일을 분리하여 관리하기 위해 시스템 property를 활용하는 방법을 시도했습니다.

 

 

 

1. logback.xml 설정 파일 경로 지정

System.setProperty("logback.configurationFile", "./logback.xml");

 

위 코드처럼 "logback.configurationFile"에 내가 원하는 log 설정 파일의 경로를 지정해줘서 jar와 설정 파일이 분리가 가능한지 테스트해봤습니다.


결론부터 말씀드리면

jar와 설정 파일의 분리는 가능했고 Logback에는 log 설정 파일에 수정사항이 있는지 스캔하는 기능이 있다는 것도 알게 되었습니다.
logback-classic이라는 놈이 주기적으로 설정 파일을 읽어서 Logback의 설정을 재구성하도록 할 수 있었습니다. 

(Automatically reloading configuration file upon modification 기능 지원 - Logback 공식 문서 참고  (https://logback.qos.ch/manual/configuration.html))

 

<configuration scan="true" scanPeriod="10 seconds">
~
</configuration>

 

scan="true" 속성을 적용하고 scanPeriod 속성을 사용하여 원하는 스캔 주기를 설정할 수 있습니다.

** 기본 스캔 주기 : 1분
    시간의 단위 : milliseconds / seconds / minutes / hours

 

반응형

 

2. Logback dependency 설정 

 

Logback dependency 설정을 위한 pom.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
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.2.3</version>
      <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
      </exclusions>
      <scope>runtime</scope>    
    </dependency>
    
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
      <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
      </exclusions>
      <scope>runtime</scope>    
    </dependency>
cs

 

3. Logback 설정 파일 작성

 

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
43
44
<configuration scan="true" scanPeriod="10 seconds">
    
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- On Windows machines setting withJansi to true enables ANSI
         color code interpretation by the Jansi library. This requires
         org.fusesource.jansi:jansi:1.8 on the class path.  Note that
         Unix-based operating systems such as Linux and Mac OS X
         support ANSI color codes by default. -->
    <withJansi>false</withJansi>
    <encoder>
      <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}][%-5level] %msg%n</pattern>
    </encoder>
  </appender>
  
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <append>true</append>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- 로그 파일 경로 및 파일명 -->
      <fileNamePattern>test/logTest.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
      
      <!-- 용량 제한 -->
      <maxFileSize>10MB</maxFileSize>
      
      <!--  30일 지난 파일 삭제 -->
      <maxHistory>30</maxHistory>
      
    </rollingPolicy>
    <encoder>
      <charset>UTF-8</charset>
      <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}][%-5level] %msg%n</pattern>
    </encoder>
  </appender>
  
  
  <logger level="TRACE" name="com.test.testProject" additivity="FALSE">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
  </logger>
  
  <root level="OFF">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
  </root>
</configuration>
cs

 

돌아보면 간단한 문제였네요 ^^

 

 

 

 

 

728x90
반응형