라이브러리 코드에서 로그인해야합니까?


38

Java 라이브러리를 개발하는 경우 라이브러리 코드 내에서 로그 문을 발행하는 것이 좋습니다.

라이브러리 내에 로깅하면 디버깅 및 문제 해결이 더 투명 해집니다. 그러나 다른 한편으로, 나는 로깅 문으로 라이브러리 코드를 흩 뜨리는 것을 좋아하지 않습니다. 고려해야 할 성능 관련 사항이 있습니까?


답변:


33

네 그렇습니다. SLF4J 와 같은 로깅 파사드를 사용하면 사용자에게 특정 로깅 프레임 워크에 부담을주지 않으면 서 유연성을 얻을 수 있습니다.

광범위하게 배포 된 구성 요소 및 라이브러리 작성자는 구성 요소 또는 라이브러리의 최종 사용자에게 로깅 프레임 워크를 부과하지 않기 위해 SLF4J 인터페이스에 대해 코딩 할 수 있습니다. 따라서 최종 사용자는 클래스 경로에 해당 slf4j 바인딩을 삽입하여 배포시 원하는 로깅 프레임 워크를 선택할 수 있습니다. 클래스 경로에서 기존 바인딩을 다른 바인딩으로 바꾸고 응용 프로그램을 다시 시작하여 나중에 변경할 수 있습니다. 이 접근 방식은 간단하고 매우 강력합니다.

또한 사용자가 SLF4J jar을 포함하지 않은 경우 ( 사용자 안내서의 ) :

SLF4J 버전 1.6.0부터 클래스 경로에 바인딩이 없으면 slf4j-api는 기본적으로 모든 로그 요청을 삭제하는 비 작동 구현으로 설정됩니다.

로깅의 성능 영향에 대해 우려되는 경우이 SLF4J FAQ 항목을 확인하십시오 . 아이디어는 문자열 인라인에 명령문을 추가하는 대신 명령문을 로그하는 매개 변수를 제공한다는 것입니다.

다음 두 줄은 정확히 동일한 출력을 산출합니다. 그러나 두 번째 양식은 사용 불가능한 로깅 명령문의 경우 첫 번째 양식보다 30 배 이상 성능이 우수합니다.

logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);

SLF4J는 또 다른 로깅 외관입니까?

SLF4J는 개념적으로 JCL과 매우 유사합니다. 따라서 또 다른 벌목 정면으로 생각할 수 있습니다. 그러나 SLF4J는 디자인이 훨씬 단순하고 더 강력합니다. 간단히 말해서 SLF4J는 [Jakarta Commons Logging]을 괴롭히는 클래스 로더 문제를 피합니다.


라이브러리 코드 내에 기록 할 수있는 훌륭한 오픈 소스 라이브러리가 있습니까? 어떻게되는지 볼 수 있을까요?
user1870400

Spring 프레임 워크는이를 수행하는 잘 알려진 Java 라이브러리입니다. 그들의 경우에 그들은 JCL을 선택했다.
Mike Partridge

17

, 라이브러리 코드에서 로그해야합니다. 개발에 도움이 될뿐만 아니라 라이브러리를 사용하는 사람들이 유용하게 사용할 수 있습니다. 필요한 로그 문만 표시하도록 항상 로깅 수준을 설정할 수 있으며 동일한 수준을 수행 할 수 있습니다.

최근 에는 오픈 소스 ORM 도구 인 Mybatis 를 사용하고 있었습니다 . 올바른 것으로 생각되는 쿼리가 결과를 반환하지 않는 문제를 디버깅했습니다. 매개 변수가있는 쿼리였으며 Mybatis가 라이브러리 코드 내에 로깅했기 때문에 쿼리를 켜고 실제 쿼리가 실행되는 것을 볼 수있었습니다. 두 개의 매개 변수를 바꾸 었다는 것을 쉽게 알 수있었습니다. 라이브러리에 로그인하지 않으면 문제를 거의 빨리 찾을 수 없었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.