첫째, 로그의 외관의 중요성
우리의 시스템이 더 복잡해질 때, 우리는 혼동하는 경향 로그인합니다. 시스템 개발의 운영과 함께, 당신은 우리가 모든 모듈이 같은 로깅 프레임 워크, 또한 시스템을 사용하여 강제로하더라도, 현재 시스템에 의존 어려운 통합 관리 및 제어에 만드는 다른 로그의 존재의 결과로, 다른 로깅 프레임 워크를 업데이트 할 수 있습니다 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.jar和slf4j-jcl.jar不能同时部署。前一个jar文件将导致jcl将日志系统的选择委托给slf4j,后一个jar文件将导致slf4j将日志系统的选择委托给jcl,从而导致无限循环。
2.log4j-over-slf4j.jar和slf4j-log4j12.jar不能同时出现
3.jul-to-slf4j.jar和slf4j-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