目录
前言
slf4j仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,所以单独的slf4j是不能工作的,必须搭配其他具体的日志实现方案,比如log4j或者log4j2,要在系统中使用slf4j。
如果不想每次都写private final Logger logger = LoggerFactory.getLogger(XXX.class);
可以在方法前用注解@Slf4j,然后直接使用log.info去打印日志。
如果注解@Slf4j注入后找不到变量log,那就给IDE安装lombok插件(idea中:1、File → settings → Plugins, 然后点击“Browse repositories”;2、输入 lombok 搜索插件, 点install安装,安装完重启idea)除此之外还要在pom文件中添加依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
配置:
1.在pom.xml中添加依赖
(前两个不添加也可以,直接写这个slf4j-log4j12其他的两个依赖也会下载下来):
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<!-- log end -->
此时会自动添加3个jar包:
2.log4j.properties
#root
log4j.rootLogger=INFO,CONSOLE,file,warnFile,errorFile
log4j.additivity.org.apache=true
# CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=info
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d %-5p %l %t |- %m%n
#file
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.DatePattern=yyyyMMdd
log4j.appender.file.Append = true
log4j.appender.file.File=../logs/logtest-all.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d %-5p %l %t |- %m%n
#warn-file
log4j.additivity.warnFile=false
log4j.appender.warnFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.warnFile.Threshold=warn
log4j.appender.warnFile.DatePattern=yyyyMMdd
log4j.appender.warnFile.Append = true
log4j.appender.warnFile.File=../logs/logtest-warn.log
log4j.appender.warnFile.layout=org.apache.log4j.PatternLayout
log4j.appender.warnFile.layout.ConversionPattern=%d %-5p %l %t |- %m%n
#error-file
log4j.additivity.errorFile=false
log4j.appender.errorFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorFile.Threshold=error
log4j.appender.errorFile.DatePattern=yyyyMMdd
log4j.appender.errorFile.Append = true
log4j.appender.errorFile.File=../logs/logtest-error.log
log4j.appender.errorFile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorFile.layout.ConversionPattern=%d %-5p %l %t |- %m%n
#dubbo
log4j.logger.com.alibaba.dubbo=ERROR
log4j.logger.org.springframework.jdbc.datasource=ERROR
##p6spy
log4j.additivity.p6spy=false
log4j.logger.p6spy=info,spyConsole,file,p6spyfile
log4j.appender.spyConsole=org.apache.log4j.ConsoleAppender
log4j.appender.spyConsole.Target=System.out
log4j.appender.spyConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.spyConsole.layout.ConversionPattern=######%m%n
log4j.appender.p6spyfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.p6spyfile.DatePattern=yyyyMMdd
log4j.appender.p6spyfile.Append = true
log4j.appender.p6spyfile.File=../logs/logtest-sql.log
log4j.appender.p6spyfile.layout=org.apache.log4j.PatternLayout
log4j.appender.p6spyfile.layout.ConversionPattern=######%m%n
##xxl-job
log4j.additivity.com.xxl.job.core=false
log4j.logger.com.xxl.job.core=ERROR
log4j.logger.com.xxl.rpc=ERROR
3.log4j.xml配置:
请看博客:https://blog.youkuaiyun.com/jingyuwang1/article/details/49430233
测试:
public class logtest {
private final Logger log = LoggerFactory.getLogger(logtest.class);
@Test
public void test1(){
System.out.println("llll");
log.info("info");
log.warn("warn");
log.error("error");
}
}
发现控制台输出:
打印出来的日志文件如下:
3个依赖的介绍:
①slf4j-api作为日志接入的接口。
compile时slf4j-api中public final class LoggerFactor类中private final static void bind()方法会寻找具体的日志实现类绑定,主要通过StaticLoggerBinder.getSingleton()的语句调用。
②slf4j-log4j12是链接slf4j-api和log4j中间的适配器。
它实现了slf4j-api中StaticLoggerBinder接口,从而使得在编译时绑定的是slf4j-log4j12的getSingleton()方法
因为在log4j之前还没有出来Slf4j,所以后来为了让log4j适配slf4j就出来了slf4j-log4j12。
③log4j是具体的日志系统。
通过slf4j-log4j12初始化Log4j,达到最终日志的输出。