왜 다른 것 대신 다음 패키지 중 하나를 사용합니까?
- 자바 로깅
- 커먼즈 로깅
- Log4j
- SLF4j
- 로그 백
왜 다른 것 대신 다음 패키지 중 하나를 사용합니까?
답변:
(내가 아는 한) api apperance의 시간순으로 :
logger.debug("The entry is {}.", entry);
//which expands effectively to
if (logger.isDebugEnabled()){
// Note that it's actually *more* efficient than this - see Huxi's comment below...
logger.debug("The entry is " + entry + ".");
}
Java로 로그인하는 것이 혼란스럽고 일관성이 없으며 문서화가 잘못되었으며 특히 우연한 것으로 나타났습니다. 더욱이, 이러한 로깅 프레임 워크 사이에는 엄청난 유사성이있어 노력의 중복과 실제로 어떤 로깅 환경에 있는지에 대한 혼란을 초래합니다. 특히 심각한 Java 웹 애플리케이션 스택에서 작업하는 경우 배수한 번에 로깅 환경; (예 : 최대 절전 모드는 log4j 및 tomcat java.util.logging을 사용할 수 있습니다). Apache commons는 다양한 로깅 프레임 워크를 연결하기위한 것이지만 실제로는 더 복잡해집니다. 이것을 미리 모르면 완전히 당황합니다. 내 로그 메시지가 콘솔 등에 인쇄되지 않는 이유는 무엇입니까? 오, 내가 log4j가 아닌 Tomcat 로그를보고 있기 때문입니다. 또 다른 복잡성 계층을 추가하면 응용 프로그램 서버에는 특정 웹 응용 프로그램에 대한 로컬 구성을 인식하지 못할 수있는 전역 로깅 구성이있을 수 있습니다. 마지막으로, 이러한 모든 로깅 프레임 워크는 너무 복잡합니다. Java에 로그인하는 것은 나 같은 개발자를 실망시키고 혼란스럽게 만드는 혼란스러운 혼란이었습니다.
Java의 초기 버전에는이 시나리오로 이어지는 기본 제공 로깅 프레임 워크가 없었습니다.
이전에 언급되지 않은 중요한 점이 하나 있습니다.
SLF4J (및 로깅 백엔드로서 Logback 및 LOG4J 모두)는 소위 Mapped Diagnostic Context (MDC, javadoc 및 문서 참조 )를 지원합니다.
이는 기본적으로 로깅 이벤트에 추가 컨텍스트 정보를 추가하는 데 사용할 수있는 스레드 로컬 Map <String, String>입니다. MDC의 현재 상태는 모든 이벤트에 첨부됩니다.
이것은 사용자 이름과 요청의 URL (웹앱의 경우)과 같은 항목을 입력하면 매우 유용 할 수 있습니다. 예를 들어 필터를 사용하여 자동으로 수행 할 수 있습니다.
오류를 기록하는 모범 사례는 무엇입니까? 질문에 대한 답변도 참조하십시오 . , 특히 :
Commons Logging에 잠재적 인 클래스 로딩 문제가 있습니다.
Log4J와 SLF4J는 Log4J에서 실제로 발견 된 문제를 통해 동일한 사람이 개발했습니다.
우리 회사 프로젝트에서는 LOG4j를 사용하며 Stephen이 그의 예에서 보여준 것처럼 사용하기 매우 쉽습니다. 또한 LOG4j에 대한 자체 패턴 클래스를 작성하여 자체 출력 파일 스키마를 만들 수 있습니다. 로그 파일의 모양을 설명 할 수 있습니다. 원래 log4j 클래스를 향상시킬 수 있습니다.
모든 LOG4j 속성은 log4j.properties 파일에서 변경할 수 있으므로 프로젝트마다 다른 파일을 사용할 수 있습니다.
Java 로깅은 내가 가장 좋아하는 것은 아니지만 처음부터 log4j를 사용하기 때문일 수 있습니다.
커먼즈 로깅 개요 는 기본 로깅 프레임 워크 통제 할 수 없을 때, 라이브러리 코드에서 로깅 다음의 존재에 대한 이유를 제공합니다. 외부 애플리케이션에 연결되는 다양한 Apache 프로젝트에 매우 중요합니다. 완전히 제어 할 수있는 내부 IT 프로젝트에는 그렇게 중요하지 않을 수 있습니다.
즉, 내가 아는 다른 많은 개발자와 마찬가지로 Commons Logging에 글을 씁니다. 그 이유는 정신적 부담을 최소화하기 위함입니다. 프로젝트 또는 작업을 변경할 수 있으며 새로운 프레임 워크를 배울 필요가 없습니다 (새 작업 / 프로젝트도 CL을 사용하고 / 또는 CL로 이동하도록 설득 할 수있는 경우).
또한 어떤 프레임 워크를 사용하든 자체 래퍼를 만드는 데 가치가 있습니다. 여기 에 설명 된대로 LogWrapper 개체를 사용하여 사용자 지정 문자열 화 (중요)를 제공하고 로깅 문의 시각적 혼란을 최소화합니다 (덜 중요 함).
일반적으로 기본적으로 Log4J를 사용합니다.
Java 1.4에 대한 종속성이 마음에 들지 않으면 Java 로깅을 사용하지만 Log4J를 선호합니다.
이미 사용했던 것을 향상시키고 있다면 Commons Logging을 사용할 것입니다.
어떤 로깅 프레임 워크 에든 쓸 수있는 얇은 로깅 파사드를 만드는 것이 좋습니다.이 시점에서 백업 엔진의 선택이 거의 논쟁 점이됩니다.