1.1 로그 소개

로그는 발생한 이벤트 목록입니다. 해상 저널이나 일기와 거의 같습니다. 따라서 로거는 기록할 수 있는 개체입니다. 프로그래밍에서는 거의 모든 것을 기록하는 것이 일반적입니다. 그리고 Java에서는 모든 것이 이와 같으며 조금 더 많습니다.

로거 자바

사실 Java 프로그램은 UI, 콘솔 등이 없는 대형 서버 애플리케이션인 경우가 매우 많습니다. 동시에 수천 명의 사용자 요청을 처리하며 종종 다양한 오류가 발생합니다. 특히 서로 다른 스레드가 서로 간섭하기 시작하는 경우.

그리고 실제로 그러한 상황에서 거의 재현되지 않는 오류와 실패를 찾는 유일한 방법은 각 스레드에서 발생하는 모든 일을 로그/파일에 기록하는 것입니다 .

대부분의 경우 호출된 메서드의 매개 변수, 차단된 모든 오류 및 많은 중간 정보에 대한 정보가 로그에 기록됩니다. 로그가 완전할수록 이벤트 시퀀스를 복원하고 실패 또는 오류의 원인을 추적하기가 더 쉬워집니다.

그러나 로그가 클수록 작업하기가 더 어려워집니다. 때때로 로그는 하루에 몇 기가바이트에 도달합니다. 이건 괜찮아.

1.2 실패한 로그

첫 번째 로그로 개발자는 단순히 콘솔에 출력을 사용했습니다 . 모든 중요한 정보와 변수 값이 콘솔에 기록되는 애플리케이션 디버깅 중에 이 작업을 수행하는 것이 편리합니다. 그러나 이러한 로그는 응용 프로그램의 정상적인 작동 중에는 완전히 적용할 수 없습니다.

첫째, 응용 프로그램은 콘솔 자체에 무언가를 출력하기를 원할 수 있으며 사용자는 프로그래머를 위한 서비스 정보를 전혀 보고 싶어하지 않습니다.

둘째, 콘솔 버퍼의 크기가 제한되어 있으므로 거기에 많이 쓸 수 없습니다.

마지막으로 셋째, 장기간에 걸쳐 수집된 프로그램 오류에 대한 정보를 프로그램 개발자에게 전달해야 한다. 그리고 이 모든 정보를 한 번에 파일에 쓰는 것이 가장 편리합니다.

개발자들은 첫 번째 문제를 신속하게 해결했습니다. 그들은 또 다른 출력 스트림을 생각해 냈습니다 System.err. 여기에 메시지를 쓸 수 있으며 표준 콘솔이 아닌 별도의 스레드로 전송됩니다.

그리고 파일 쓰기 문제도 해결되었습니다.

// Define the file to which we will write the log
System.setErr(new PrintStream(new File("log.txt")));
// Display messages
System.err.println("Message 1");
System.err.println("Message 2");
// Display an error message
try {
    throw new Exception("Error message");
} catch (Exception e) {
    e.printStackTrace();
}

하지만 이 형태로도 모든 문제가 해결되지 않았기 때문에 로그 메시지를 파일에 기록하는 특수 라이브러리를 만들기로 결정했습니다. 그녀는 현명한 방식으로 이를 수행했으며 기록된 이벤트 및 데이터에 대한 필터를 구성할 수 있는 유연성을 허용했습니다.

실제로 전체 로깅 프로세스는 세 부분으로 구성됩니다.

  • 첫 번째 부분은 정보 수집 입니다 .
  • 두 번째 부분은 수집된 정보의 필터링 입니다.
  • 세 번째 부분은 선택한 정보를 기록하는 것 입니다.

1.3 log4j 로거 소개

Java 커뮤니티에서 처음으로 인기 있는 로거는 log4j. 프로젝트에 포함하는 것은 매우 간단합니다. 이를 위해 pom.xml에 몇 줄만 추가하면 됩니다.

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>2.2.17</version>
</dependency>

이러한 로거와 프로그램의 상호 작용은 다음과 같습니다.

class Manager {
   private static final Logger logger = LoggerFactory.getLogger(Manager.class);

   public boolean processTask(Task task) {
        logger.debug("processTask id = " + task.getId());
        try {
            task.start();
            task.progress();
            task.complete();
            return true;
        } catch (Exception e) {
            logger.error("Unknown error", e);
            return false;
        }
    }
}

여기에서 세 가지 일이 발생합니다.

개체 생성이 녹색으로 강조 표시됩니다 Logger . 개체는 편리한 추가 작업을 위해 정적 변수에 저장됩니다. 또한 getLogger()정보가 수집된 클래스에 대한 정보도 메서드에 전달됩니다.

파란색으로 강조 표시된 줄은 디버깅 중에만 값 정보를 기록하는 곳입니다 . 이를 위해 특별한 방법이 사용됩니다.debug()

마지막으로 발생한 예외를 로그에 저장하는 줄이 빨간색으로 강조 표시됩니다 . 예외는 잠재적 오류이므로 error().