Java

[Java] JGit Progress Monitor 퍼센트 Slf4j 로거로 출력하기

@developer.kye 2022. 4. 26. 14:16

JGit

JGit은 git protocol을 Java에서 사용할 수 있게 하는 라이브러리다.

JGit is an EDL (new-style BSD) licensed, lightweight, pure Java library implementing the 
Git version control system

https://www.eclipse.org/jgit/

 

개인적으로 업무상 자주 사용할 일이 많은데, 은근히 로깅 처리할 일 이 많을때 git clone 진행상태를 실시간으로 확인할 수 있게 설정해 놓으면 훨신 시간가늠이 편하고 디버깅 하기 쉽기 때문에 주로 설정해놓는 편이다.

👉  그래서 오늘은 Progress Monitor 를 생성하여 Slf4j 로거를 통해 진행현황을 출력시키는 방법을 적어보려고 한다. ^^

 

터미널에서 깃클론을 하게때리게  되면 아래처럼 진행현황을 퍼센트로 보여준다.

성격이 급급한 사람들에게는 이 숫자가 1 하나라도 올라가는게 참으로 안심이 아닐 수가 없다.

$ git clone https://github.com/facebook/relay.git
Cloning into 'relay'...
remote: Enumerating objects: 3813503, done.
remote: Counting objects: 100% (7381/7381), done.
remote: Compressing objects: 100% (419/419), done.
remote: Total 3813503 (delta 4622), reused 7378 (delta 4622), pack-reused 3806122
Receiving objects: 100% (3813503/3813503), 2.28 GiB | 5.25 MiB/s, done.
Resolving deltas: 100% (2458811/2458811), done.

 

자바에서도 동일하게 로그를 출력해보자!

 

아래가 일반 System.out 으로 진행현황을 출력시키게 하는 설정이기 때문에 slf4j 를 통해 설정된 로그 형식으로 출력되지 않는다. 

 Git git = Git.cloneRepository()
            .setURI(url)
            .setDirectory(myDirectory)
            .setProgressMonitor(new TextProgressMonitor(new PrintWriter(System.out)))
            .call();

 

주로 Java 에서는 lombok을 활용해 slf4j 를 통해 로깅을 처리하는데, 설정한 형식대로 예쁘게 로깅이 잘 나오다가 갑자기 System.out으로 나오면 뭔가 심기가 불편해지는.. 그런 게 있달까? 

 

친절한 금자씨 - 예뻐야  돼, 뭐든지 예쁜 게 좋아."

 

1. 원하는 로그 형식으로 출력을 BatchingProgressMonitor를 상속하는 ProgressMonitor 클래스를 생성한다.

@Slf4j
public class ProgressMonitor extends BatchingProgressMonitor {
    private String url;

    public ProgressMonitor (String url){
        this.url = url;
    }
    @Override
    protected void onUpdate(String taskName, int workCurr) {
        log.debug("[{}] {} {}", url, taskName, workCurr);
        
    }

    @Override
    protected void onEndTask(String taskName, int workCurr) {
        log.debug("[{}] {} {}", url, taskName, workCurr);
        
    }

    @Override
    protected void onUpdate(String taskName, int workCurr, int workTotal, int percentDone) {
        log.debug("[{}] {} {}/{} {}%", url, taskName, workCurr, workTotal, percentDone);
    }

    @Override
    protected void onEndTask(String taskName, int workCurr, int workTotal, int percentDone) {
        log.debug("[{}] {} {}/{} {}%", url, taskName, workCurr, workTotal, percentDone);
    }
    
}

2. 다음과 같이 ProgressMonitor에 생성한 클래스 오브젝트를 넣어준다.

 Git git = Git.cloneRepository()
            .setURI(url)
            .setDirectory(myDirectory)
            .setProgressMonitor(new ProgressMonitor(url))
            .call();

3. 출력이 잘 나오는지 확인한다.

로그 화면