[java] Quartz Scheduler를 사용한 로그 백업 스케줄링

많은 애플리케이션들은 로그 파일을 생성하고 유지하는데 사용됩니다. 이러한 로그 파일은 정보 디버깅, 경고 및 트레이싱과 같은 목적으로 사용됩니다. 그러나 로그 파일은 커질 수 있으며, 오랫동안 유지되어 리소스를 차지할 수 있습니다.

따라서, 로그 파일을 주기적으로 백업하여 공간을 절약하고 시스템의 성능을 향상시킬 수 있습니다. Quartz Scheduler를 사용하여 로그 백업을 자동으로 스케줄링하는 방법에 대해 알아보겠습니다.

Quartz Scheduler란?

Quartz Scheduler는 Java 애플리케이션에서 작업을 예약하고 실행할 수 있는 강력한 오픈소스 라이브러리입니다. 이 라이브러리는 매우 유연하며, 다양한 스케줄링 옵션을 지원합니다.

로그 백업 스케줄링 구현

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class LogBackupScheduler {
    public static void main(String[] args) {
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

            JobDetail job = JobBuilder.newJob(LogBackupJob.class)
                    .withIdentity("logBackupJob", "group1")
                    .build();

            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("logBackupTrigger", "group1")
                    .withSchedule(SimpleScheduleBuilder.repeatMinutelyForever(60))
                    .build();

            scheduler.scheduleJob(job, trigger);
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

위의 예제 코드는 Quartz Scheduler를 사용하여 로그 백업을 스케줄링하는 방법을 보여줍니다. 이 코드는 LogBackupJob이라는 클래스를 실행하는 logBackupJob이라는 Job을 생성하고, 매 60분마다 실행되도록 Trigger를 설정합니다.

LogBackupJob 클래스 구현하기

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

public class LogBackupJob implements Job {
    private static final String LOG_DIR = "path/to/log/directory";
    private static final String BACKUP_DIR = "path/to/backup/directory";

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        LocalDateTime now = LocalDateTime.now();

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss");
        String timestamp = now.format(formatter);

        File logDir = new File(LOG_DIR);
        
        if (!logDir.exists()) {
            throw new JobExecutionException("Log directory does not exist");
        }
        
        File[] logFiles = logDir.listFiles();

        for (File logFile : logFiles) {
            String backupFilename = logFile.getName() + "_" + timestamp;
            File backupFile = new File(BACKUP_DIR, backupFilename);
            
            try {
                Files.copy(logFile.toPath(), backupFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
                logFile.delete();
            } catch (IOException e) {
                throw new JobExecutionException("Error backing up log file: " + logFile.getName(), e);
            }
        }
    }
}

위의 예제 코드는 LogBackupJob 클래스를 정의하여 로그 파일 백업 로직을 구현합니다. LOG_DIR 변수는 로그 파일이 있는 디렉토리 경로를, BACKUP_DIR 변수는 백업 파일을 저장할 디렉토리 경로를 나타냅니다.

execute() 메서드 내에서는 현재 시간을 기준으로 파일 이름에 타임스탬프를 추가하여 백업 파일을 생성하고, 원래 로그 파일을 백업 파일로 복사한 후 삭제합니다.

결론

Quartz Scheduler를 사용하여 로그 백업을 자동으로 스케줄링하는 방법에 대해 알아보았습니다. 이를 통해 로그 파일을 관리하고 리소스를 절약할 수 있으며, 시스템 성능을 향상시킬 수 있습니다. Quartz Scheduler의 다양한 기능을 활용하여 더욱 복잡한 스케줄링 작업을 구현할 수도 있습니다.

참고 자료