DevJong12

[OrientalUnity][Spring, NCP] Effective Log Search & Analytics 적용기 본문

프로젝트/OrientalUnity

[OrientalUnity][Spring, NCP] Effective Log Search & Analytics 적용기

Jong12 2023. 11. 7. 14:55
728x90

목차

     

    1️⃣ Effective Log Search & Analytics란?

    네이버 클라우드의 설명은 다음과 같으며, 역할은 그냥 로그수집기로, 일정 금액을 내면서 로그수집하는것이다.


    2️⃣ 사용 이유

    먼저 필자가 구성한 인프라 아키텍쳐를 확인이 필요하다. 아래의 이미지는 필자가 구축한 인프라다.

     

    위의 이미지를 확인해보면 알 수 있듯이 Spring을 실행하는 서버가 3개다.. 즉 내가 로그를 확인하려면 일일이 Private한 서버에 직접 접속을 해서 Docker의 Container Log를 확인해야 하는 문제가 발생한다.

     

    즉 귀찮다~ 이말이다. Log4j를 사용한 로그를 편하게 한곳에서 보고 싶다는 니즈를 만족하고자 Effective Log Search & Analytics를 도입해야겠다는 판단을 하게 되었다.


    3️⃣ 도입때부터 적용까지의 모든 문제사항...

    정말 많은데.. 나열해보자면

    1. 모바일에서 주로 사용하는 서비스처럼 소개가 되어있다..
    2. 정말 정말 오래된 서비스, 업데이트가 없다
    3. 참고할 Reference가 없다
    4. 너무 오래되었다 보니 라이브러리가 충돌하면서 Application이 실행되지 않았다
    5. Private Zone에서 외부 즉 Public한 공간으로 통신을 허용해줘야 한다.
      1. 해당 문제는 추후 NAT Gateway와 연결이 된다. 따로 글을 작성할 예정이다.

    4️⃣ Spring 적용 전 준비사항

    1. SDK다운로드

    Naver에서 제공한 SDK다운로드 페이지에서 SDK의 다운로드가 필요하다.

    필자도 정확히 뭐가 필요한지는 모르고, 일단 적용이 성공했을때 사용한 라이브러리를 기록하였다. 아래의 두가지를 다운로드 받으면 된다.

    • nelo2-java-sdk-log4j-1.6.6 
    • nelo2-java-sdk-logback-1.6.6

    2. 다운로드 받은 SDK를 Project내부에 추가

    디렉토리의 명칭은 꼭 libs가 아니어도 된다. 또한 log4j2가 존재하는 이유는.. 이것 저것 다 해본다고 추가 하였다. 꼭 필요하진 않다..

    3. Repository 생성

    https://console.ncloud.com/elsa/projects에서 Repository의 생성이 필요하다.

     

    Repository생성을 누르고 다음의 정보를 기록하면 되며, 필자는 ObjectStorage로 Log저장까지 진행하였다.

     

    안내가 잘되어있어 부차적인 설명은 하지 않도록 하겠다.


    5️⃣ Spring Boot 적용방법

    먼저 주의할 것이, 필자의 경우 spring.profiles.active의 값이 dev인 경우에만 Log를 발송시키고, local의 환경에서는 Log를 발송하지 않는 환경을 구축하였다.

     

    1. Build.gradle 의존성 추가

    폴더에 추가한 라이브러리를 Spring Boot의 의존성에 추가해야 한다.

    추가로 apache의 thrift라이브 러리도 추가가 필요하다. 이는 공식가이드에서 지정한 사항이다.

     

    공식가이드와 다른점은 commons-logging을 제거해야 할 필요가 있다.

     

    필자의 경우 Spring Boot3를 사용하면서 commons-logging라이브러리가 Conflicts를 발생하면서 Application의 실행이 되지 않았기 때문이다.

     

    dependencies {
    	implementation files("libs/nelo2-java-sdk-core-1.6.6.jar")
    	implementation files("libs/nelo2-java-sdk-logback-1.6.6.jar")
    	implementation('org.apache.thrift:libthrift:0.9.3') {
    		//Commons-logging 충돌로인한 삭제
    		exclude group: 'commons-logging', module: 'commons-logging'
    	}
    }

     

    2. logback.xml 파일 추가

    필자의 경우 다음과 같은 logback파일을 추가했으며, 다음과 같은 설정을 진행했다.

     

    설정은 가이드에 존재하지만 말해주자면, 기존의 log파일을 사용해야 하는게 아닌 직접 다운로드받은 SDK의 Log4j, LogBack 라이브러리를 활용해야 하기 때문이다.

     

    실제로 아래의 코드를 보면 naver.nelo2를 활용하는걸 볼 수 있다. 가이드를 기준으로 본인이 필요한 logback설정을 구축하면 될 듯 하다.

     

    ※ 추가적으로 projectName의 경우에는 elsa에서 생성된 프로젝트 키 항목에 기입된 value를 기록해야 한다.

    <configuration>
        <!-- Console Appender -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss} [%-5level]\(%file:%line\) %msg%n</pattern>
            </encoder>
        </appender>
    
        <appender name="nelo" class="com.naver.nelo2.logback.ThriftAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>TRACE</level>
            </filter>
            <param name="projectName" value="P4ce633_hook-killer-be" />
            <param name="collectorUrl" value="elsa-col.ncloud.com" />
            <param name="encoding" value="utf-8" />
            <param name="timeout" value="1200" />
            <param name="enable" value="true" />
            <param name="debug" value="false" />
            <param name="version" value="1.0.0" />
            <param name="errorCodeType" value="default" />
            <param name="port" value="10006" />
            <param name="isBulkEnabled" value="true" />
        </appender>
    
        <appender name="nelo-logback-async" class="ch.qos.logback.classic.AsyncAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>info</level>
            </filter>
            <param name="neverBlock" value="true" />
            <param name="includeCallerData" value="true" />
            <param name="queueSize" value="2048" />
            <appender-ref ref="nelo" />
        </appender>
    
    
        <!-- Logger -->
        <logger name="HookKiller.server" additivity="false">
            <level value="debug"/>
            <appender-ref ref="STDOUT" />
            <appender-ref ref="nelo-logback-async" />
        </logger>
        <!-- Root Logger -->
        <root level="info">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="nelo-logback-async" />
        </root>
    </configuration>

     

    3. profiles.active의 설정에 따른 라이브러리 변경법

    이제 보면 알겠지만..? 다음 두개의 가정으로 작업을 진행하면 된다.

    • active가 local인 경우에는 logback설정파일이 설정되지 않도록 한다.
    • active가 dev인 경우에는 logback설정파일이 설정 될 수 있도록 한다.

     

    필자의 경우 설정파일을 다음과 같이 구성하였으며, application-localapplication-dev의 차이점 보면 될 듯 하다.

     

     

    그리고 차이점이 존재하는 코드 두줄이다. 

    아래의 코드가 local에는 존재하지 않지만, dev에는 존재한다.

    logging:
      config: classpath:config/logback/logback-${spring.profiles.active}.xml
    

     

     


    6️⃣ 해당 코드가 적용된 Repository

    위의 프로젝트는 다음의 링크에서 확인이 가능하다

    https://github.com/hook-killer/back-end

     

    GitHub - hook-killer/back-end: 동북아 자동번역 커뮤니티 OU의 BackEnd Repository입니다.

    동북아 자동번역 커뮤니티 OU의 BackEnd Repository입니다. Contribute to hook-killer/back-end development by creating an account on GitHub.

    github.com


    7️⃣ 결과물

    정말로 내가 원하는 결과물 그대로다.. 👍

    Application에서 내가 log4j로 남긴 로그들이 잘 넘어온다.. 

    좌측 메뉴바의 영롱한 Host 14개의 갯수를봐라.. (Auto Scalling하느라 Host가 좀 많았다)


    8️⃣ 글을 마치며..

    정보가 없고.. 업데이트가 없는 서비스를 사용하는게 이리 힘들줄은 몰랐다...

     

    정말 집단지성이 고맙다는걸 다시금 체감할 수 있던 시간이었다..

     

    해당 서비스와 관해서 Naver에도 문의를 했었는데 답변을 받아 볼 수가 없었다...(상담원이 연결이 안되가지고)

    나처럼 사용할 사람들은 미리 염두해 두면서 사용하면 좋을 듯 하다.


    9️⃣ 참조한 Reference

     

     

    728x90
    Comments