자바 로깅 프레임 워크 --Slf4j 사용

첫째, 로그의 외관의 중요성

우리의 시스템이 더 복잡해질 때, 우리는 혼동하는 경향 로그인합니다. 시스템 개발의 운영과 함께, 당신은 우리가 모든 모듈이 같은 로깅 프레임 워크, 또한 시스템을 사용하여 강제로하더라도, 현재 시스템에 의존 어려운 통합 관리 및 제어에 만드는 다른 로그의 존재의 결과로, 다른 로깅 프레임 워크를 업데이트 할 수 있습니다 MyBatis로 등 다른 유사한 봄의 타사 프레임 워크의 사용을 피하기 어려운, 그들은 서로 다른 로깅 프레임 워크를 지정 우리에 의존뿐만 아니라, 자신의 로깅 시스템에 로그 시스템에서 여전히 혼란을 일관성이있다. . .

공통 로그 외관 : JCL, SLF4J

공통 로깅 구현 : 7월, log4j에, logback, log4j2

두, SLF4J 사용 ( http://www.slf4j.org/ )

간단히 외관 로그 (단순 로깅 외관에 대한 자바) : SLF4J는 주로 표준 Java 로깅 액세스 설정, 표준화 된 API 프레임 워크를 제공하기 위해, 주요 의미는 인터페이스의 특정 구현을 제공하는 등의 log4j와 logback 같은 다른 로깅 프레임 워크라고 할 수있다 등등. 물론 SLF4J 중 자신은 비교적 간단하지만 거의 사용되지 달성 할 수있는 기능을 제공합니다. 일반 자바 프로젝트 로그 워크 선택 SLF4J-API 다리 완료 중간 다리를 사용하여 특정 구현 프레임 워크 (log4j에, logback 등)와 결합 된 외관 등을.

SLF4J는 세계면 가장 인기 로그 외관 현재. 이제 프로젝트는 기본적으로 우리의 로그 시스템으로 SLF4J를 사용.

SLF4J 로그 외관은 주로 두 가지 기능을 제공합니다 :

     1. 바인딩 로깅 프레임 워크;

SLF4J 다양한 로깅 프레임 워크를 지원한다. SLF4J 릴리스가 지원하는 프레임 워크에 "SLF4J 바인딩"라는 몇 jar 파일, 각 바인딩에 대응 온다.

사용 SLF4J 로그 바인딩 과정 :

첨가 (1) SLF4J-API에 의존

(2) API SLF4J 통합 로깅 프로젝트의 사용

(3) 특이 적 결합 로깅 구현 프레임 워크

   해당 직접 의존 첨가 SLF4J 로깅 프레임 워크를 달성 된 바인딩

   SLF4J 로깅 워크가 달성되지 바인딩, 제 부가 로그 어댑터, 부가 종속 구현 클래스

(4) SLF4J와 만 결합 프레임의 로그를 달성 (기본이 발생하면 제 로그 종속 구현 복수)

로깅 프레임 워크를 전환하려면, 당신은 단순히 클래스 경로에 바인딩 SLF4J를 교체 할 수 있습니다. 예를 들어,의 log4j java.util.logging의 전환하려면 SLF4J-jdk14-1.7.28.jar SLF4J-log4j12-1.7.28.jar로 교체합니다.

SLF4J 특정 클래스 로더에 의존하지 않는다. 사실, 바인딩 각 SLF4J 컴파일 시간은  하드 와이어 , 오직 하나의 특정 로깅 프레임 워크를 사용합니다. 컴파일시에 사용 log4j에 대한 예를 들어, SLF4J-log4j12-1.7.28.jar 바인딩 바인딩. 코드에서뿐만 아니라 API를-1.7.28.jar - SLF4J 이상 만 선택해야 오직 하나의 적절한 클래스 경로 드래그 위치에 바인딩합니다. 클래스 경로에 여러 바인딩을 올려 놓지 마십시오. 이것은 일반적인 생각의 그래픽 그림입니다.

2. 로깅 워크 다리;

일반적으로, 당신은에 의존하는 구성 요소 중 일부는 외부 SLF4J 로깅 API에 의존하고 있습니다. 이러한 구성 요소가 가까운 미래에 SLF4J로 전환되지 않는 것을 가정 할 수있다. 이 문제를 해결하기 위해, SLF4J 브리지는 것입니다 여러 모듈과 함께 제공 , JCL 및 java.util.logging의 API를 Log4j는 그들이 SLF4J API에 대한 동일한 것처럼, 전화 리디렉션.

이 솔루션은 로깅 API하기 전에 시스템에 존재하는, 당신은 브리지에 의해 달성 SLF4J로 전환 할 수 있습니다 때, 프로젝트 로그에 남아있는 문제를 해소하는 것입니다

1. 전에 먼저 이전 로깅 프레임 워크를 제거 의존하고

브릿 징 구성 요소를 제공 SLF4J를 추가합니다

프로젝트 실현을 SLF4J를 추가합니다 

문제에 대한주의 :

1.jcl-over-slf4j.jarslf4j-jcl.jar不能同时部署。前一个jar文件将导致jcl将日志系统的选择委托给slf4j,后一个jar文件将导致slf4j将日志系统的选择委托给jcl,从而导致无限循环。

2.log4j-over-slf4j.jarslf4j-log4j12.jar不能同时出现

3.jul-to-slf4j.jarslf4j-jdk14.jar不能同时出现

4.所有的桥接都只对Logger日志记录器对象有效,如果程序中调用了内部的配置类或者是Appender,Filter等对象,将无法产生效果。

三、Slf4j入门

日志框架的绑定:

1.添加依赖:

slf4j绑定内置的日志实现框架

 <!--        slf4j日志门面-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.26</version>
    </dependency>
<!--        slf4j内置的简单实现-->
    <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-simple</artifactId>
         <version>1.7.21</version>
    </dependency>

slf4j绑定logback日志实现框架

<!--        slf4j日志门面-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.26</version>
    </dependency>

<!--        logback日志实现-->
    <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-classic</artifactId>
          <version>1.2.3</version>
    </dependency>

 nop日志开关:

<!--        slf4j日志门面-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.26</version>
    </dependency>

<!--        nop日志开关-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-nop</artifactId>
        <version>1.7.25</version>
    </dependency>

slf4j绑定log4j日志实现框架 


<!--        slf4j日志门面-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.26</version>
    </dependency>

<!--    绑定 log4j日志实现,需要导入适配器-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.29</version>
    </dependency>

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

绑定 log4j日志实现,不仅需要导入适配器,还需要导入配置文件log4j.properties:

#配置根  Loggers控制日志的输出级别与日志是否输出
log4j.rootLogger=trace,console

#自定义logger对象设置
log4j.logger.LoggerDemo = info,file

#配置输出到控制台  Appenders是指定日志的输出方式
log4j.appender.console=org.apache.log4j.ConsoleAppender
#指定输出控制台
log4j.appender.console.Target = System.out
#指定布局,输出日志的格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#指定布局的参数
log4j.appender.console.layout.ConversionPattern=[%-10p] %r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n


#配置输出到控制台  Appenders是指定日志的输出方式
log4j.appender.file=org.apache.log4j.FileAppender
#指定布局,输出日志的格式
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#指定布局的参数
log4j.appender.file.layout.ConversionPattern=[%-10p] %r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
#指定日志文件保存路径
log4j.appender.file.file = /logs/log4j.log
#指定日志文件字符集
log4j.appender.file.encoding = UTF-8

#配置输出到控制台  Appenders是指定日志的输出方式
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
#指定布局,输出日志的格式
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
#指定布局的参数
log4j.appender.rollingFile.layout.ConversionPattern=[%-10p] %r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
#指定日志文件保存路径
log4j.appender.rollingFile.file = /logs/log4j.log
#指定日志文件字符集
log4j.appender.rollingFile.encoding = UTF-8
#指定日志文件内容的大小
log4j.appender.rollingFile.maxFileSize = 1MB
#指定日志文件的数量
log4j.appender.rollingFile.maxBackupIndex = 10

#配置输出到控制台  Appenders是指定日志的输出方式
log4j.appender.dailyRollingFile=org.apache.log4j.DailyRollingFileAppender
#指定布局,输出日志的格式
log4j.appender.dailyRollingFile.layout=org.apache.log4j.PatternLayout
#指定布局的参数
log4j.appender.dailyRollingFile.layout.ConversionPattern=[%-10p] %r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
#指定日志文件保存路径
log4j.appender.dailyRollingFile.file = /logs/log4j.log
#指定日志文件字符集
log4j.appender.dailyRollingFile.encoding = UTF-8
#指定日志输出规则
log4j.appender.dailyRollingFile.datePattern = '.'yyyy-MM-dd-HH-mm-ss


#mysql
log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender
#指定布局,输出日志的格式
log4j.appender.logDB.layout=org.apache.log4j.PatternLayout

log4j.appender.logDB.Driver = com.mysql.jdbc.Driver
log4j.appender.logDB.URL = jdbc:mysql://localhost:3306/logs
log4j.appender.logDB.User = root
log4j.appender.logDB.Password = root
log4j.appender.logDB.Sql = INSERT INTO log(project_name,create_date,level,category,file_name,thread_name,line,all_category,message) values('itcast','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')

slf4j绑定jul日志实现框架 


  <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.5.6</version>
    </dependency>

<!--    绑定jul日志实现,需要导入适配器-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-jdk14</artifactId>
        <version>1.5.6</version>
    </dependency>

2.测试Demo

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SLF4j {

    public static final Logger LOGGER = LoggerFactory.getLogger(SLF4j.class);

//        快速入门
    @Test
    public void test01() throws Exception{
//        日志输出
        LOGGER.error("error");
        LOGGER.warn("waring");
        LOGGER.info("info");
        LOGGER.debug("debug");
        LOGGER.trace("trace");

//        使用占位符输出日志消息
        String name = "itheima";
        Integer age = 14;
        LOGGER.info("用户:{},{}",name,age);

//        异常日志输出
        try {
            int i = 1/0;
        } catch (Exception e) {
            LOGGER.error("出现异常:",e);
        }
    }
}

3.测试结果:

slf4j绑定内置的日志实现框架的测试结果:

[main] ERROR SLF4j - error
[main] WARN SLF4j - waring
[main] INFO SLF4j - info
[main] INFO SLF4j - 用户:itheima,14
[main] ERROR SLF4j - 出现异常:
java.lang.ArithmeticException: / by zero
	at SLF4j.test01(SLF4j.java:26)
...

slf4j绑定logback日志实现框架的测试结果:

20:25:21.724 [main] ERROR SLF4j - error
20:25:21.739 [main] WARN SLF4j - waring
20:25:21.739 [main] INFO SLF4j - info
20:25:21.739 [main] DEBUG SLF4j - debug
20:25:21.739 [main] INFO SLF4j - 用户:itheima,14
20:25:21.742 [main] ERROR SLF4j - 出现异常:
java.lang.ArithmeticException: / by zero
	

 nop日志开关,打开日志开关的测试结果:

 日志开关打开了,关闭了日志打印的功能

F:\DevelopmentTools\Java\jdk1.8.0_152\bin\java.exe -ea -...

Process finished with exit code 0

slf4j绑定log4j日志实现框架的测试结果:

[ERROR     ] 0 SLF4j.test01(SLF4j.java:14) 2020-02-20 00:10:50.942 error
[WARN      ] 3 SLF4j.test01(SLF4j.java:15) 2020-02-20 00:10:50.945 waring
[INFO      ] 3 SLF4j.test01(SLF4j.java:16) 2020-02-20 00:10:50.945 info
[DEBUG     ] 3 SLF4j.test01(SLF4j.java:17) 2020-02-20 00:10:50.945 debug
[TRACE     ] 4 SLF4j.test01(SLF4j.java:18) 2020-02-20 00:10:50.946 trace
[INFO      ] 5 SLF4j.test01(SLF4j.java:23) 2020-02-20 00:10:50.947 用户:itheima,14
[ERROR     ] 5 SLF4j.test01(SLF4j.java:28) 2020-02-20 00:10:50.947 出现异常:
java.lang.ArithmeticException: / by zero

slf4j绑定jul日志实现框架的测试结果:

二月 20, 2020 12:31:55 下午 SLF4j test01
严重: error
二月 20, 2020 12:31:55 下午 SLF4j test01
警告: waring
二月 20, 2020 12:31:55 下午 SLF4j test01
信息: info
二月 20, 2020 12:31:55 下午 SLF4j test01
信息: 用户:itheima,14
二月 20, 2020 12:31:55 下午 SLF4j test01
严重: 出现异常:
java.lang.ArithmeticException: / by zero

日志框架的桥接:

1.添加依赖:

log4j的桥接器,替代log4.jar包以及适配器,让logback日志实现log4j日志

<!--        slf4j日志门面-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.26</version>
    </dependency>
<!--        logback日志实现-->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
<!--    配置log4j的桥接器-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>log4j-over-slf4j</artifactId>
        <version>1.7.26</version>
    </dependency>

2.测试demo 

import org.apache.log4j.Logger;
import org.junit.Test;

public class Log4jTest {
//    定义 log4j 日志记录器
    public static final Logger LOGGER = Logger.getLogger(Log4jTest.class);

//    测试桥接器
    @Test
    public void test01() throws Exception{
        LOGGER.info("hello log4j");
    }

}

3.测试结果:

13:20:55.469 [main] INFO Log4jTest - hello log4j

 

发布了17 篇原创文章 · 获赞 11 · 访问量 7998

추천

출처blog.csdn.net/LOVE_Me__/article/details/104395184