05AM

Error : Github action으로 CI/CD 중 permission denied 본문

Error Traceback

Error : Github action으로 CI/CD 중 permission denied

_05AM 2023. 7. 21. 23:41

에러

java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - openFile(/var/log/tattour/error.log,true) call failed. java.io.FileNotFoundException: /var/log/tattour/error.log (Permission denied)

과정

  1. logback-spring.xml 추가 후 에러 발생
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">

    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />

    <!-- 로그 파일이 저장될 경로 -->
<!--    <springProperty name="filePath" source="logging.file.path"/>-->
   <property name="LOG_PATH" value="/var/log/tattour"/>
<!--     <property name="LOG_PATH" value="./logs"/>-->

    <!-- 로그 파일 이름 -->
    <property name="LOG_FILE_NAME" value="error"/>

    <!-- 로그 출력 패턴 -->
    <property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%line] - %msg%n"/>

    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){green} %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}"/>

    <!-- 로그 레벨 -->
    <!--
    	1) ERROR : 오류 메시지 표시
        2) WARN  : 경고성 메시지 표시
        3) INFO  : 정보성 메시지 표시
        4) DEBUG : 디버깅하기 위한 메시지 표시
        5) TRACE :  Debug보다 훨씬 상세한 메시지 표시

        아래에서는 info로 설정하였는데, 이 경우엔 INFO 보다 위에 있는 DEBUG와 TRACE는 표시하지 않는다.
    -->
    <property name="LOG_LEVEL" value="info"/>

    <!-- CONSOLE에 로그 출력 세팅 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>${CONSOLE_LOG_CHARSET}</charset>
        </encoder>
    </appender>

    <!-- File에 로그 출력 세팅 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 파일 경로 설정 -->
<!--        <file>${filePath}/${LOG_FILE_NAME}.log</file>-->
        <file>${LOG_PATH}/${LOG_FILE_NAME}.log</file>

        <!-- 출력패턴 설정-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>

    <!-- Rolling 정책 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
      <fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <!-- 파일당 최고 용량 kb, mb, gb -->
        <maxFileSize>10MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
      <!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
      <maxHistory>30</maxHistory>
      <!--<MinIndex>1</MinIndex>
      <MaxIndex>10</MaxIndex>-->
    </rollingPolicy>
  </appender>

  <!-- 로그 전역 세팅 -->
  <root level="${LOG_LEVEL}">
    <!-- 위에 설정한 콘솔 설정 추가 -->
    <appender-ref ref="CONSOLE"/>

    <!-- 위에 설정한 파일 설정 추가 -->
    <appender-ref ref="FILE"/>
  </root>
</configuration>
  1. file path로 설정했던 경로에 code deploy를 실행하는 user(ubuntu)에게 폴더에 대한 권한이 없어서 일어나는 에러
  2. file path에 해당하는 폴더 구조(/var/log/tattour)와 파일 error.log를 배포 전에 서버에 미리 만들어 둔다.
  3. 로그 파일이 저장되는 file path의 읽기, 쓰기, 실행 권한을 code deploy를 수행하는 user ubuntu에게 부여한다. 사실 실행 권한을 줘야 하는지는 모르겠다. 이후에 알아보겠다.
    • 권한 부여
    # 읽기, 쓰기 권한
    $ sudo chown ubuntu /var/log/tattour
    
    # 실행 권한
    $ sudo chmod +x error.log
    • 부여한 권한 확인
    $ ls -l /var/log/tattour
    

추가

logback-spring.xml을 추가했을 때 에러가 발생하지 않아서 지나칠 수 있지만 ch.qos.logback.core와 ch.qos.logback.classic을 build.gradle에 추가하지 않으면 java.lang.NoClassDefFoundError: ch/qos/logback/core/util/ContextUtil 에러가 발생한다.

// log back
    implementation 'ch.qos.logback:logback-classic'
    implementation 'ch.qos.logback:logback-core'
Comments