简单点说,slf4j-api提供接口,slf4j-log4j提供具体的实现。也就是 slf4j只是一个日志标准,并不是日志系统的具体实现,如果项目只有slf4j的包是没有办法实现日志功能的。
slf4j
slf4j是一个日志接口,自己没有具体实现日志系统,只提供了一组标准的调用api,这样将调用和具体的日志实现分离,使用slf4j后有利于根据自己实际的需求更换具体的日志系统,比如,之前使用的具体的日志系统为log4j,想更换为logback时,只需要删除log4j相关的jar,然后加入logback相关的jar和日志配置文件即可,而不需要改动具体的日志输出方法,试想如果没有采用这种方式,当你的系统中日志输出有成千上万条时,你要更换日志系统将是多么庞大的一项工程。如果你开发的是一个面向公众使用的组件或公共服务模块,那么一定要使用slf4的这种形式,这有利于别人在调用你的模块时保持和他系统中使用统一的日志输出。
slf4j日志输出时可以使用{}占位符,如,logger.info("testlog: {}", "test"),而如果只使用log4j做日志输出时,只能以logger.info("testlog:"+"test")这种形式,前者要比后者在性能上更好,后者采用+连接字符串时就是new 一个String 字符串,在性能上就不如前者。
log4j
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
如何使用?
引入jar,使用log4j时需要的jar为:log4j.jar。
定义配置文件log4j.properties或log4j.xml
在具体的类中进行使用:
在需要日志输出的类中加入:private static final Logger logger = Logger.getLogger(Tester.class); //通过Logger获取Logger实例
在需要输出日志的地方调用相应方法即可:logger.debug(“System …..”)
logback
logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,官方网站: http://logback.qos.ch,是slf4j的原生实现(即直接实现了slf4j的接口,而log4j并没有直接实现,所以就需要一个适配器slf4j-log4j12.jar),logback一共有以下几个模块:
logback-core:其它两个模块的基础模块
logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
同样,单独使用它时,需要引入以上jar,然后进行配置文件的配置,最后就是在相关类中进行使用,使用时加入以下语句:
private final static Logger logger = LoggerFactory.getLogger(Test.class);
logger.info("打印日志");
总结如下:
1、slf4j是java的一个日志门面,实现了日志框架一些通用的api,log4j和logback是具体的日志框架。
2、他们可以单独的使用,也可以绑定slf4j一起使用。
单独使用,分别调用框架自己的方法来输出日志信息。绑定slf4j一起使用。调用slf4j的api来输入日志信息,具体使用与底层日志框架无关(需要底层框架的配置文件)。显然不推荐单独使用日志框架。假设项目中已经使用了log4j,而我们此时加载了一个类库,而这个类库依赖另一个日志框架。这个时候我们就需要维护两个日志框架,这是一个非常麻烦的事情。而使用了slf4j就不同了,由于应用调用的抽象层的api,与底层日志框架是无关的,因此可以任意更换日志框架
logback配置使用
导入依赖
这里务必使用最新的版本
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
如果是springboot项目则不用单独导入依赖,因为在spring-boot-starter中依赖了spring-boot-starter-logging依赖了logback-classic
如图:
配置文件: logback-spring.xml 或logback.xml (spring会识别这个文件)
logback.xml详细配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 根据不同环境的配置文件动态选择日志过滤level -->
<property resource="bootstrap.properties" />
<property resource="bootstrap-${spring.profiles.active}.properties" />
<!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
<property name="LOG_PATTERN" value="%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} - %msg %n" />
<!-- 定义日志存储的路径,不要配置相对路径 -->
<property name="FILE_PATH" value="D:/GTIDS-Logs/ids-log.%d{yyyy-MM-dd}.%i.log" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志级别过滤INFO以下 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${log.level}</level>
</filter>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--每天生成一个日志文件,保存30天的日志文件。rollingFile用来切分文件的 -->
<appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${FILE_PATH}</fileNamePattern>
<!-- keep 30 days' worth of history -->
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 日志文件的最大大小 -->
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 超出删除老文件 -->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<logger name="jdbc" level="OFF"/>
<logger name="jdbc.sqlonly" level="OFF"/>
<logger name="jdbc.sqltiming" level="DEBUG"/>
<logger name="jdbc.audit" level="OFF"/>
<logger name="jdbc.resultset" level="OFF"/>
<logger name="jdbc.resultsettable" level="OFF"/>
<logger name="jdbc.connection" level="OFF"/>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="rollingFile" />
</root>
</configuration>
项目目录:
这里引入了项目中的bootstrap.properties利用spring.profiles.active
配置的环境来获取每个环境配置中不同的log.level
,如在bootstrap-dev.properties中配置log.level=DEBUG
,在bootstrap-prod.properties中配置log.level=INFO
,这样就可以动态根据不同环境运行不同的过滤level了。
对xml里各配置属性详情可参考https://blog.csdn.net/zzzgd_666/article/details/80458444
实测日志文件可以每天生成,保留30天的日志文件
参考:
https://www.cnblogs.com/hanszhao/p/9754419.html
https://www.cnblogs.com/qlqwjy/p/9275415.html