티스토리 뷰

logback에 spring profile을 왜 적용하는가? 이유는 간단하다. 하나의 파일만 만들기 위해서다. spring profile을 적용하지 않는다면 logback.xml 하나만 있어도 될걸 logback-dev.xml, logback-prd.xml 등등 각 PHASE에 맞는 파일들을 생성한 뒤 배포를 하고 파일을 덮어 씌우는 형식으로 하거나, 아니면 직접 서버에 들어가서 경로를 수정하거나 하는 번거로움이 있다. 비단 logback 뿐만 아니라 spring profile은 여러모로 배포하는 입장에서는 무척 유용하다.

 

springboot 를 사용한다면 이와 결합하여 간단하게 spring profile을 적용할 수 있겠지만 springboot를 사용하지 않는 프로젝트라면 logback에 spring profile을 적용은 특별한 방법을 써야 한다. 

 

pom.xml

<dependency>
	<groupId>org.codehaus.janino</groupId>
	<artifactId>janino</artifactId>
	<version>2.7.7</version>
</dependency>

<dependency>
	<groupId>org.codehaus.janino</groupId>
	<artifactId>commons-compiler</artifactId>
	<version>2.7.7</version>
</dependency>

일단 pom.xml에 위와 같은 dependency에 추가를 해준다. janino는 설정 파일에서 JAVA 표현식(if 등)을 사용할 수 있게 해주는 라이브러리이다. 즉 logback.xml 파일에서 if를 사용하기 위해 이것들을 추가시켜주는 것이다.

logback 관련 라이브러리는 물론 추가가 되어 있어야 한다. 

 

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">

  <if condition='isDefined("spring.profiles.active")'> 
    <then> 
      <!-- ########### local ###########-->
      <if condition='"${spring.profiles.active}".contains("local")'>
        <then> 
          <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
              <pattern>[%d{HH:mm:ss.SSS}][%-5level][%logger{36}.%method:line%line] - %msg%n</pattern>
            </encoder>
          </appender>

          <root level="debug">
            <appender-ref ref="console" />
          </root>
        </then>
      </if>

      <!-- ########### 개발 ###########-->
      <if condition='"${spring.profiles.active}".contains("dev")'>
        <then> 
          <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>/logs/application/app.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
              <fileNamePattern>/logs/application/app.%d{yyyy-MM-dd}.log</fileNamePattern>
              <maxHistory>30</maxHistory>
            </rollingPolicy>
            <encoder>
              <pattern>[%d{HH:mm:ss.SSS}][%-5level][%logger.%method:line%line] - %msg%n</pattern>
            </encoder>
          </appender>	

          <root level="info">
            <appender-ref ref="file" />
          </root>
        </then>
      </if>
    </then>
  </if>
</configuration>

설정을 보면 한번에 이해가 될것이다. local에서는 console appender를 사용하고 log level은 debug, dev에서는 file appender를 사용하고 log level은 info로 PHASE에 따라 다른 로깅방식을 사용한것이다. 

필자처럼 크게 이런식으로 묶어도 되고 appender, logger 레벨로 나눠도 된다. 중요한건 if, then으로 spring profile에 따라서 구분을 할 수 있다는 것이다. 꼭 spring profile이 아니라도 system property에 따라 구분해서 사용해도 무방하다. 

 

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
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