3.1 이벤트 레벨 목록

로깅은 프로그램이 실행되는 동안 발생하는 모든 이벤트를 기록하는 프로세스입니다. 프로그래머로서의 당신의 의무는 이상하거나 심각한 오류가 있을 record everything important때 이 로그 외에는 아무것도 남지 않을 것이기 때문 입니다.production

오류에 대한 모든 정보와 모든 호출 기록이 있으면 오류가 몇 배 더 빨리 제거됩니다. 그러나 여기에서 간단한 결론이 나옵니다. 일반적으로 모든 것을 기록합니다 : 모든 메소드 호출, 모든 매개 변수 값.

이것은 또한 옵션이 아닙니다. 너무 많은 정보는 너무 적은 것만큼이나 나쁩니다. 스마트 로깅이 필요합니다. 사람을 위해 사람에 의해 만들어졌습니다. 여기서 우리는 로깅에 대한 첫 번째 사실에 도달합니다. 로그의 모든 항목은 생성 당시에도 범주로 나뉩니다.

이벤트 레벨 목록

로그에 이벤트를 작성할 때 프로그래머는 이 정보가 얼마나 중요한지 스스로 결정해야 합니다. 이벤트의 심각도 수준은 메시지 작성자가 선택합니다. log4j기록된 정보 중요도에는 5가지 수준이 있습니다 .

  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL

아래에서 더 자세히 설명합니다.

3.2 디버그

레벨은 DEBUG가장 덜 중요한 것으로 간주됩니다. 이 중요도 수준으로 로그에 기록되는 정보는 애플리케이션 디버깅 중에만 필요합니다. 디버깅 시 필요한 정보를 로깅하기 위해 메소드를 사용합니다 debug().

예:

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;
        }
    }
}

메소드는 debug메소드의 맨 처음에 있으며(메소드는 아직 아무 것도 할 시간이 없음) 메소드에 전달된 변수의 값을 로그에 기록합니다. 이것은 방법의 가장 일반적인 사용 사례입니다 debug().

3.3 정보 및 경고

다음 두 수준은 INFO및 입니다 WARN. 두 가지 방법 이 있습니다 info().warn()

이 수준은 INFO단순히 정보 메시지에 사용됩니다. 이것과 저것이 발생합니다. 로그에서 오류 구문 분석을 시작할 때 배경을 읽는 것이 매우 유용할 수 있습니다. 방법은 이것에 완벽합니다 info().

수준은 경고를 작성하는 데 사용됩니다( warningWARN 단어에서 유래 ). 일반적으로 이 수준의 중요도에서는 문제가 발생했다는 정보가 기록되지만 프로그램은 이 상황에서 수행할 작업을 알고 있습니다.

예를 들어, 파일을 디스크에 쓰는 과정에서 그러한 파일이 이미 존재한다는 것이 밝혀졌습니다. 여기에서 프로그램은 경고(경고)를 기록할 수 있지만 사용자에게 대화 상자를 표시하고 다른 파일 이름을 선택하도록 제안합니다.

예:

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

    public boolean saveFile(FileData file) {
        logger.info(“save the file ” + file.getName());
        boolean resultOK = SaveUtils.save(file);
        if (resultOK) return true;

        logger.warn(“file writing problem ” + file.getName());
        String filename = Dialog.selectFile();
        boolean result = SaveUtils.save(file, filename);
        return result;
    }

3.4 오류 및 치명적

마지막으로 가장 중요한 두 가지 로깅 수준은 ERROR및 입니다 FATAL. 그들에게는 같은 이름을 가진 특별한 방법도 있습니다: error()fatal().

그들은 또한 오류를 일반 오류치명적 오류의 두 범주로 나누기로 결정했습니다 . 치명적인 오류는 대부분 응용 프로그램 충돌(데스크탑 응용 프로그램의 경우) 또는 웹 서비스 충돌(웹 응용 프로그램의 경우)로 이어집니다.

또 다른 좋은 예는 Windows 운영 체제입니다. 프로그램이 방금 충돌한 경우 운영 체제의 관점에서 이것은 Error. 그리고 운영 체제 자체가 무너지고 Windows 블루 스크린 죽음이 보이면 이것은 이미 Fatal error.

Java 애플리케이션에서 이벤트는 발생한 예외와 가장 자주 연관 Error됩니다 . Fatal예:

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;
        }
    }
}

3.5 무엇을 기록할 것인가

물론 모든 것을 연속으로 기록할 가치는 없습니다. 이는 대부분의 경우 로그의 가독성을 급격히 떨어뜨리며, 결국 로그는 읽기 위해 처음부터 작성하게 된다.

또한 각종 개인정보 및 금융정보를 로그에 기록할 수 없습니다. 이제 이것으로 엄격하고 쉽게 벌금이나 소송을 당할 수 있습니다. 조만간 그러한 통나무가 옆으로 새어 문제가 없을 것입니다.

그렇다면 무엇을 기록해야 할까요?

먼저 애플리케이션 시작을 기록해야 합니다 . 애플리케이션이 시작된 후 작동 모드와 다양한 중요 설정을 기록하는 것이 좋습니다. 이렇게 하면 나중에 로그를 더 쉽게 읽을 수 있습니다.

둘째, 애플리케이션이 작동하는 모든 타사 서비스 (메일링 시스템, 외부 서비스) 의 상태를 기록해야 합니다 . 최소한 연결 순간을 확보하여 제대로 작동하는지 확인해야 합니다.

셋째, 모든 예외를 기록해야 합니다 . 예상되는 경우 그에 대한 정보를 간결하게 작성할 수 있습니다. 예외에 대한 완전한 정보는 버그를 검색할 때 중요한 정보의 50%-80%를 제공합니다.

또한 응용 프로그램 종료를 기록해야 합니다 . 애플리케이션은 정상적으로 종료되어야 하며 로그에 수십 개의 오류가 발생하지 않아야 합니다. 종종 이곳에서 작업 중단, 스레드 풀 문제 또는 임시 파일 삭제 문제를 찾을 수 있습니다.

보안 및 사용자 인증 과 관련된 모든 것을 기록하십시오 . 사용자가 연속 10회 로그인 또는 비밀번호 재설정을 시도하면 이 정보가 로그에 반영되어야 합니다.

비동기 작업에 대해 가능한 한 많은 정보를 기록합니다 . 이러한 스레드에서는 예외가 종종 손실됩니다. 비동기 작업의 경우 시작과 끝을 기록해야 합니다. 성공적인 완료는 문제가 있는 것과 동일한 방식으로 기록되어야 합니다.

또 뭐야? 시간 제한 작업 시작, 저장된 작업 시작 SQL-procedures, 데이터 동기화, 분산 트랜잭션과 관련된 모든 것. 시작하기에 충분하다고 생각합니다. 나중에 이 목록에 추가할 것입니다.