Java가 생성 한 다양한 프레임 워크 (Spring 등)의 각 프레임 워크는 다른 로그 시스템을 사용합니다. 하나의 JVM에서 여러 다른 로그를 혼합하는 데 특정 문제가 있습니다. 여기서 우리는 Java 시스템의 공통 로그 프레임 워크를 분류하고 SFL4J를 중심으로 한 각 로그 프레임 워크와의 관계를 소개하며 프로덕션 환경에서 다양한 로그 프레임 워크를 관리하는 방법을 소개합니다.
1. 인터페이스 소개
Java 시스템에는 주로 두 가지 로그 시스템 인터페이스가 있습니다 : SLF4J 및 Common-Logging. 로그백, 로그 4J 등과 같은 많은 프레임 워크가 있습니다.
물론, 둘 다 인터페이스이지만, 둘은 브리지 패킷을 통해 상호 로그 프록시 출력을 달성 할 수 있습니다.
공통 로깅 장착의 로그 구현은 종종 log4J입니다. 초기화 중에, 누가 마운트 해야하는지에 대한 특별한 사양이 없으면 위의 순서로 자동으로 인스턴스화됩니다. log4jlogger는 log4j의 logger를 캡슐화하고 로그를 인쇄 할 때 Log4J를 호출합니다.
2. Bridge와 Slf4J에서 다리를 옮겼습니다
인터페이스 정의로서 SLF4J는 하단에 많은 구현 프레임 워크를 가질 수 있으며 SFL4J에 대한 다른 로그 구현 또는 프레임 워크를 지원할 수도 있습니다. 구현은 다른 브리지 패키지를 기반으로합니다.
2.1 SLF4J 브리지
인터페이스 정의로 아래에는 많은 구현이 있습니다. 구현 원칙은 iloggerFactory를 얻을 때 초기화를 수행하는 것입니다. 초기화 프로세스는 구현 객체를 바인딩합니다. staticLoggerBinder를 구현하는 모든 클래스를로드 한 다음 싱글 톤을 얻습니다. getLogger를 실행할 때이 싱글 톤 클래스의 방법을 호출하여 로깅 함수의 특정 구현으로 해당 로거 객체를 얻습니다. 여러 구현이 있으면 그 중 하나를 바인딩하십시오. 이 상황은 원치 않는 로그 구현 클래스를 제거해야합니다.
2.2 SLF4J가 브리지되었습니다
위의 그림은 다른 로그 시스템이 SLF4J 로그 시스템에 어떻게 연결되는지 보여줍니다. 기본 원칙은 해당 로그 시스템을 프록시하여 SFL4J 인터페이스에 출력하는 것입니다. 특정 구현의 경우 브리지 패키지의 구현을 볼 수 있습니다. 기본적으로 원래 로그 구현이 상환되었으며 실제로 로그 출력을 호출하는 기본 방법은 SLF4J입니다.
Java는 JDK 구현과 함께 제공되기 때문에 JUL 만 예외입니다. 해당 클래스를 다시 살펴 보는 것은 불가능합니다. 이 장소는 Jul Handler Extension 메커니즘을 기반으로 SLF4J 핸들러를 구현 한 다음 SLF4J에 로그를 씁니다. 적용하려면 새 핸들러를 .handlers 속성으로 구성하려면 JRE/LIB/LOGGING.POPERTIES를 수정해야합니다. 일반적으로 생산은 다음과 같이 이루어지지 않습니다.
2.3 응용 프로그램
실제 프로젝트를 적용 할 때 브리지와 브리지 패키지가 동시에 나타날 수 없도록주의하십시오. 그렇지 않으면 죽은 루프가 발생합니다. 예를 들어, sfl4j는 log4J와 log4J를 모두 브리지하고 LOG4J 출력 호출은 SLF4J를 가리키고 SLF4J는이 루프에서 log4J를 가리 킵니다. 쓸모없는 패키지를 제거하십시오.
생산 제안 : SLF4J-API의 구현은 로그백 만 유지하며 상단 로그 인쇄 브리지는 모두 SLF4J를 가리키는 것이있을 수 있습니다.
다음 종속성을 참조하면 다른 모든 로그 패키지가 제외됩니다.
<pectionies> <pectinement> <groupId> org.slf4j </groupid> <artifactid> slf4j-api </artifactid> <bersion> 1.7.24 </version> </dependency> <groupid> ch.qos.logback </groupid> <artifactid> logback-classic </artifactid> <2.1.2.1.2.1.2.1.2.1. <pectionency> <groupId> org.slf4j </groupid> <artifactid> jcl-over-slf4j </artifactid> <버전> 1.7.14 </version> </fectionency> <pectomency> <groupId> org.slf4j </groupid> <artifactid> log4j- 버전> 1.7.24 </의존성> <pectionency> <groupId> org.slf4j </groupid> <artifactid> jul-to-slf4j </artifactid> <bersion> 1.7.7 </version> </fectionency> </dependencies>
3. 테스트 코드 구현 및 POM
테스트 코드
공개 클래스 testloggers { / ** * slf4j-api-> slf4j-log4j12-> log4j * / public void testsfl4juplog4j () {org.slf4j.logger = loggerfactory.getLogger (testLoggers.class.getName ()); logger.info ( "SLF4J 인쇄 사용 log4j"); } / ** * slf4j-api-> slf4j-jcl-> common-logging-api (자동으로 log4j)-> log4j * / public void testslf4j2commonlogging () {org.slf4j.logger logger = loggeractory.getlogger.class.getname (); logger.warn ( "SLF4J 프린트로 공통 로깅"); } / ** * log4j-over-slf4j-api-> logback classic * / public void testlog4j2slf4j () {org.apache.log4j.logger logger = org.apache.log4j.logger.getLogger (testLoggers.class.getName (); logger.info ( "log4j print to slf4j"); } / ** * jcl-over-slf4j-> sfl4-api-> logback * / public void testCommonLogging2Sl4J () {log log = logfactory.getLog (testLoggers.class.getName ()); log.info ( "SLF4J에 공통 로그"); }/** * JUL (Console Default)-> JER/LIB/LOGGING.Properties에 org.slf4j.bridge.slf4jbridgehandler를 추가하기 위해 */slf4j-> logback */publoid testjul2slf4j () {java.utger .logger = java.util.logging.logger.getLogger (testLoggers.class.getName ()); logger.info ( "Jul print to slf4j"); } public static void main (String [] args) {testLoggers tester = new TestLoggers (); tester.testslf4j2commonlogging (); }}Maven 종속성을 테스트하십시오
<pectionies> <pectinement> <groupId> org.slf4j </groupid> <artifactid> slf4j-api </artifactid> <bersion> 1.7.24 </version> </dependency> <groupId> commons-logging </groupid> <artifactid> commons-logging-api </artifactid> <!-<pectionency>-> <!-<groupId> org.slf4j </groupid>-> <!-<artifactid> jcl-over-slf4j </artifactid>-> <!-<버전> 1.7.14 </version>-> <!-</dependency> <pectomency> <groupid> org.slf4j </groupid> <Artifactid> log4j-over-slf4j </artifactid> <bersion> 1.7.24 </version> </dependency> <!-<pectionency>-> <!-<groupid> org.slf4j </groupid>-> <! <!-</fectionency>-> <!-<pectionency>-> <!-<groupid> ch.qos.logback </groupid>-> <!-<artifactid> logback classic </artifactid>-> <!-<bersion> 1.2.1 </version>-> <!-</fectionency> <!-<peplency>- <!-<groupid> org.slf4j </groupid>-> <!-<artifactid> slf4j-log4j12 </artifactid>-> <!-<bersion> 1.7.5 </version>-> <!-</fectionency>-> <groupid> log4j </groupid> <artifactid> </artifactid> <버전> 1.2.17 </version> </dependency> <pectionency> <groupId> org.slf4j </groupid> <artifactid> slf4j-jcl </artifactid> <버전> 1.7.24 </dependency> </dependency>
위의 기사에서는 다른 로그 시스템과의 SLF4J 호환성 사용이 내가 공유하는 모든 내용입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.