[오류 해결] EFK TCP 통신

na.ram·2024년 12월 2일

all in auction

목록 보기
9/14

😮‍💨 문제 상황

스프링 로그들을 Fluentd에서 수집할 때 TCP 통신을 이용하기 위해 LogstashTcpSocketAppender를 통해 로그 수집하도록 구현했습니다.

왜 LogstashTcpSocketAppender?
TCP 통신을 위해 여러 TcpAppender들을 적용해보았지만 Fluentd에 어떠한 로그도 전달되지 않음을 확인했습니다. 유일하게 LogstashTcpSocketAppender를 적용했을 때만 Fluentd에 로그가 들어오고 있었습니다.

그러나 로그가 들어오고 있는 Fluentd와는 다르게 Elastic Search에서는 어떠한 로그도 전달받지 못하고 있음을 확인했습니다.


🔎 이유

LogstashTcpSockerAppender에서 발송하는 JSON의 형식과 Fluentd에서 기대하는 JSON 형식이 달라 파싱 오류가 발생해 로그가 발송되지 않았습니다.

그렇기 때문에 TCP 통신 대신 스프링에서 로그 파일을 생성하고, 해당 파일을 Fluentd에서 읽어가도록 변경하였습니다.

  • 일자별로 로그 파일을 생성하도록 logback-spring.xml 구성
  • 로그 파일은 저장공간을 낭비하게 될 수 있으므로 maxHistory를 정해 일정 기간 이후 삭제
  • 최대 용량을 정해두고 넘어가면 자동압축이 되도록 구현
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">

    <!-- FLUENTD -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>./log/all-in-auction-logback-${DATETIME}.log</file>
        <encoder>
            <pattern>{"@timestamp":"%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ}", "level":"%level", "service":"auction999", "trace": "%X{X-B3-TraceId:-}", "span": "%X{X-B3-SpanId:-}", "thread":"%thread", "logger":"%logger", "message":"%msg"}%n
            </pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>./log/all-in-auction-logback-%d{yyyy-MM-dd}_%i.zip</fileNamePattern>
            <maxHistory>10</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFileNamingAndTriggeringPolicy">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
  
    ...
</configuration>

🥹 추가 (문제 아닌) 문제 상황

로컬에서는 로그 파일을 통해 해결 완료되었으나 실제 서버는 도커로 배포중입니다.

따라서 도커에서 공유 볼륨을 지정해 Fluentd에서 읽어가도록 구성해주어야 했습니다.
그러기 위해서는 배포 파이프라인의 수정이 필요했는데 이미 Fluentd에서 TCP 통신이 되지 않는 문제를 해결하기 위해 상당한 시간을 소요해 해당 부분을 수정하기에 시간이 부족하다고 판단하였습니다.


💡 해결

Logstash는 서버 실행 시, 로그를 tcp 통신으로 전송할 수 있어 따로 공유 볼륨을 지정할 필요 없습니다.
또한 현재의 기술 스택에 Fluentd를 도입할 때 참고할 수 있는 자료보다 Logstash를 도입할 때 참고할 수 있는 자료의 양이 훨씬 많아 트러블슈팅이 수월합니다.

따라서 Fluentd를 Logstash로 변경, 최종적으로 ELK Stack을 구축하였습니다.

0개의 댓글