local 환경 로그 수집

EC2 프리 티어의 한계

Elasticsearch, logstash, Kibana의 컨테이너를 ec2 프리 티어에서 사용하고 있었다.

이 컨테이너들은 메모리를 많이 잡아먹기 때문에 프리 티어에서 관리하기가 매우 힘들었다. 프리 티어 인스턴스 3개를 사용해서 해결할 수 있겠지만 로컬에서 배포된 웹 서버 로그를 가져와서 로컬에서 모니터링을 하기로 했다.

로컬에서 웹 서버 로그 수집하기

어떻게 웹 서버의 로그 파일을 로컬로 가져오는 방법은 리버스 터널링도 생각해봤지만, 로컬에서 scp 명령을 사용해 ec2 인스턴스에 배포된 웹 서버의 로그 파일을 가져오는 것이 쉬울 것이다. 그래서 crontab을 설정해서 주기적으로 로그 파일을 가져와서 붙여 넣고 로컬에서 돌아가는 logstash가 로그를 수집, 필터링해서 elasticsearch로 전달하여 kibana에서 확인할 수 있다.

이렇게 동작하기 위해서 몇 가지 수정사항이 발생했다.

[logbak.xml]

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />

    <property name="CONSOLE_LOG" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %yellow(%5level) %magenta(%logger) - %msg%n" />
    <property name="FILE_LOG" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %5level %logger - %msg%n" />

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG}</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>./log/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>1</maxHistory>
        </rollingPolicy>
    </appender>

    <logger name="com.feelcoding.logbackdemo" level="DEBUG" />
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

가장 먼저 Springboot의 logback.xml 파일을 수정했다. 이전에는 logstash로 바로 전송했지만 ec2 -> local로는 tcp 통신하기 힘들었기 때문에 이를 파일로 저장했다. 파일 크기는 최대 100MB, 보관 기간은 하루로 설정했다.

[logstash.conf]

웹 서버 로그를 tcp 통신으로 바로 logstash에 전송할떄는 json으로 전송되어서 바로 읽을 수 있었다. 하지만 로그 파일은 txt로 저장되었고 저장할 때, 별도의 파싱 설정을 하지 않아서 text 형식으로 저장되었다. 그래서 logstash에서 읽을 수 없었고 filter를 통해서 읽을 수 있는 형식으로 변환해서 elastisearch로 전송한다.

[transfer.sh]

scp 명령을 crontab으로 스케줄링하여 주기적으로 ec2 인스턴스에서 서버의 로그를 전달받고 로컬에서 로그를 시각화했다.

Last updated