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
, 데이터 동기화, 분산 트랜잭션과 관련된 모든 것. 시작하기에 충분하다고 생각합니다. 나중에 이 목록에 추가할 것입니다.
GO TO FULL VERSION