[java] Quartz Scheduler와 분산 로그 분석 연동하기

이번 글에서는 Quartz Scheduler를 사용하여 작업을 예약하고 실행하는 방법과 분산 로그 분석 도구인 ELK 스택(Logstash, Elasticsearch, Kibana)과의 연동 방법을 알아보겠습니다.

Quartz Scheduler는 Java 기반의 오픈 소스 작업 예약 라이브러리로, 설정된 일정에 따라 작업을 실행할 수 있습니다. 이를 통해 정기적으로 반복되는 작업이나 특정 시간에 실행되어야 하는 작업을 간편하게 예약할 수 있습니다.

Quartz Scheduler 설정하기

먼저, Quartz Scheduler를 프로젝트에 추가하고 설정해야 합니다. Maven을 사용하는 경우, pom.xml 파일에 다음 의존성을 추가합니다.

<dependencies>
  <dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
  </dependency>
</dependencies>

Quartz Scheduler를 설정하기 위해 quartz.properties 파일을 생성하고, 다음과 같이 필요한 설정을 추가합니다.

org.quartz.scheduler.instanceName = SampleScheduler
org.quartz.threadPool.threadCount = 5

위 설정에서는 최대 5개의 동시 작업을 처리할 수 있는 스레드 풀을 설정하고 있습니다. 필요에 따라 설정값을 조절할 수 있습니다.

작업 예약하기

이제 Quartz Scheduler를 사용하여 작업을 예약하는 방법에 대해 알아보겠습니다. 먼저, 작업을 정의하기 위해 Job 인터페이스를 구현한 클래스를 작성합니다.

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class SampleJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 작업 실행 로직
    }
}

위 클래스에서는 Job 인터페이스의 execute 메서드를 구현하여 작업 실행 로직을 작성합니다.

작업을 예약하기 위해 Quartz Scheduler에 작업 정보를 등록해야 합니다. 아래 코드 예제는 3초마다 작업을 실행하는 예약 작업을 등록하는 예시입니다.

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class SchedulerExample {
    public static void main(String[] args) throws SchedulerException {
        JobDetail job = JobBuilder.newJob(SampleJob.class)
                .withIdentity("sampleJob", "group1")
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("sampleTrigger", "group1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(3)
                        .repeatForever())
                .build();

        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    }
}

위 예제에서는 SampleJob 클래스를 사용하여 작업을 실행하고, 3초마다 반복하는 작업을 등록하고 있습니다.

분산 로그 분석 연동하기

마지막으로, Quartz Scheduler와 분산 로그 분석 도구인 ELK 스택을 연동하는 방법을 알아보겠습니다.

ELK 스택은 Logstash, Elasticsearch, Kibana의 조합으로 로그 데이터를 수집, 저장 및 시각화할 수 있는 도구입니다. Quartz Scheduler에서 생성되는 로그를 ELK 스택을 통해 중앙 집중화하여 관리할 수 있습니다.

먼저, Quartz Scheduler에서 생성되는 로그를 Logstash로 전송하기 위해 logback.xml 파일에 다음 설정을 추가합니다.

<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>localhost:5000</destination>
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
        <providers>
            <timestamp>
                <timeZone>UTC</timeZone>
            </timestamp>
            <pattern>
                <pattern>
                    {
                        "application": "quartz-scheduler",
                        "level": "%level",
                        "message": "%message"
                    }
                </pattern>
            </pattern>
        </providers>
    </encoder>
</appender>

위 설정에서는 Logstash로 전송할 로그 데이터를 JSON 형식으로 변환하는 설정을 추가하고 있습니다.

Logstash는 입력으로 로그 데이터를 받아 Elasticsearch로 전송하는 역할을 합니다. Logstash를 실행하기 위해 다음과 같이 logstash.conf 파일을 생성합니다.

input {
  tcp {
    port => 5000
    codec => json_lines
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "quartz-scheduler"
  }
}

위 설정에서는 TCP 입력 포트를 5000으로 지정하고, 입력된 로그 데이터를 JSON 형식으로 전송합니다. 이후 Elasticsearch에 quartz-scheduler 인덱스로 저장됩니다.

마지막으로, 저장된 로그 데이터를 시각화하기 위해 Kibana를 사용합니다. Kibana를 실행하고 Elasticsearch와 연결한 후, quartz-scheduler 인덱스로부터 로그 데이터를 조회하고 원하는 대시보드를 생성할 수 있습니다.

마무리

이번 글에서는 Quartz Scheduler를 설정하고 작업을 예약하는 방법, 그리고 ELK 스택과의 연동 방법에 대해 알아보았습니다. Quartz Scheduler를 사용하여 작업을 예약하고 ELK 스택을 통해 로그 데이터를 관리하면, 효율적인 작업 관리 및 분산 로그 분석이 가능해집니다.

더 자세한 내용은 다음 참고 자료를 참고하시기 바랍니다.

감사합니다.