AWS EC2에서 서비스를 실행할 때 아래와 같이 Logback 오류가 발생하였습니다.

스택트레이스를 분석해 보면 로그파일 상대경로가 적용되지 않는 것을 볼 수 있습니다.

java[341106]: Caused by: java.lang.IllegalStateException: Logback configuration error detected:
java[341106]: ERROR in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - Failed to create parent directories for [/logs/logFile.log]
java[341106]: ERROR in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - openFile(logs/logFile.log,true) call failed. java.io.FileNotFoundException: logs/logFile.log (No such file or directory)

 


해결책은 다음과 같습니다.

 

1.  Profile 별 로그파일 경로를 설정할 수 있도록 application.yml 구성

log.config.path 설정을 추가하여 logback-spring.xml에서 RollingFileAppender 파일경로를 설정합니다. 

 

1-1. application-local.yml

spring:
application.name: testProject
config:
activate:
on-profile: local
logging:
config: classpath:logback-spring.xml
log:
config:
path: logs

 

1-2. application-dev.yml

spring:
application.name: testProject
config:
activate:
on-profile: dev
logging:
config: classpath:logback-spring.xml
log:
config:
path: /home/ubuntu/myProject/logs

 

2. logback 설정 구성

RollingFileAppender는 FileAppender를 상속하여 로그 파일을 rollover 합니다. 

logback-spring.xml 파일을 구성하여 RollingFileAppender 파일경로를 설정합니다.

설정해야 할 property는 다음과 같습니다.

Property Type Description
file String 타깃 파일의 이름
append boolean (default: true) append 정책. true: 이어 쓰기, false: 덮어 쓰기
encoder Encoder 로그 이벤트가 OutputStreamAppender에 기록되는 방식
rollingPolicy RollingPolicy rollover 발생 시 RollingFileAppender의 행동
triggeringPolicy TriggeringPolicy rollover 활성화 시점 
predent boolean FileAppender와 동일.

FixedWindowRollingPolicy는 prudent mode를 지원하지 않는다.

TimeBasedRollingPolicy일 경우 두가지 제한조건에 대해 prudent mode 제공
1. 파일 압축 불가능
2. file 프로퍼티는 설정되지 않아야 한다

 

2-1. logback-spring.xml

logback-spring.xml 파일을 단순화 하기 위하여 logback-custom.xml 파일 include

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="logback-custom.xml"/>
<springProfile name="(local||dev)">
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<!-- rolling file에는 debug, console에는 trace 분리하여 처리 가능하다. -->
<logger name="org.hibernate.type" level="TRACE"/>
<logger name="com.test.myProject" level="DEBUG"/>
<logger name="org.hibernate.SQL" level="DEBUG"/>
<!-- HikariConfig -->
<logger name="com.zaxxer.hikari.HikariConfig" level="DEBUG" />
</springProfile>
</configuration>

 

2-2. logback-custom.xml

SpringProperty 설정을 통해 Profile 별 파일경로를 지정하는 구문 추가

<?xml version="1.0" encoding="UTF-8"?>
<included>
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="CONSOLE_LOG_CHARSET" value="${CONSOLE_LOG_CHARSET:-default}"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>${CONSOLE_LOG_CHARSET}</charset>
</encoder>
</appender>
<springProperty name="LOG_PATH" source="log.config.path" defaultValue="logs/"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/logFile.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>
%d{HH:mm:ss.SSS} [%thread] %-3level %logger{20}[%line] -%msg%n
</pattern>
</encoder>
</appender>
</included>

 

읽어주셔서 감사합니다.

 

레퍼런스
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기