Log日志(二)

1. slf4j log4j logback的关系

The Simple Logging Facade for Java 是什么?

笼统的讲就是slf4j是一系列的日志接口,而log4j logback是具体实现了的日志框架。接下来我们跟着官方文档详细的来看一下他们的关系。

The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks, such as java.util.logging, logbackand log4j. SLF4J allows the end-user to plug in the desired logging framework at deployment time. Note that SLF4J-enabling your library/application implies the addition of only a single mandatory dependency, namely slf4j-api-1.7.21.jar.

官方文档的这一段话已经明确描述了三者的关系。slf4j译为简单日志门面,是日志框架的抽象。而log4j和logback是众多日志框架中的几种。

即,是jdbc和mysql驱动的关系。项目中使用slf4j的api操作日志,底层的日志实现由其他日志框架完成。

项目中直接使用slf4j是一种解耦的设计。如果直接使用日志框架也可以但更换日志框架时会需要改代码。

2. 测试

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Test
public void test2(){// 手动会的Logger对象Logger logger = LoggerFactory.getLogger(TestMybatis.class);// 输出日志信息logger.debug("ssss");
}@Slf4j // lombok注解,自动为class生成一个属性:Logger log;
public class A{// 如下属性会自动生成//private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(A.class);public void fn1(){// 直接使用log,输出日志信息log.info("xxxx");}
}
#如果只导入了slf4j 而没有导入任何日志框架,则会报出如下警告:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

3. log4j和logback呢?

而log4j和logback就是两个受欢迎的日志框架。但两者又有不同。

  • log4j是apache实现的一个开源日志组件。(Wrapped implementations)
  • logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架。是slf4j的原生实现。(Native implementations)

在这里插入图片描述
上图可以看到应用程序对日志框架的调用关系。应用程序调用slf4j api,而日志的输出最终是由底层的日志框架来实现的。这张图也提现了log4j和logback的不同。

官方文档对logback的描述

NATIVE IMPLEMENTATION There are also SLF4J bindings external to the SLF4J project, e.g. logback which implements SLF4J natively. Logback’s ch.qos.logback.classic.Logger class is a direct implementation of SLF4J’s org.slf4j.Logger interface. Thus, using SLF4J in conjunction with logback involves strictly zero memory and computational overhead.

可以看到logback是直接实现了slf4j的接口,是不消耗内存和计算开销的。

而log4j不是对slf4j的原生实现,所以slf4j api在调用log4j时需要一个适配层。

所谓“直接实现”,“需要适配层”:


<dependency><groupId>org.slf4jgroupId><artifactId>slf4j-apiartifactId><version>1.7.12version>
dependency>


<dependency><groupId>org.slf4jgroupId><artifactId>slf4j-log4j12artifactId><version>1.7.12version>
dependency>

<dependency><groupId>log4jgroupId><artifactId>log4jartifactId><version>1.2.16version>
dependency>

<dependency><groupId>ch.qos.logbackgroupId><artifactId>logback-classicartifactId><version>1.1.7version>
dependency>

4. 配置

一般情况下,开发阶段使用debug,上线后使用Info



DOCTYPE log4j:configuration PUBLIC "-//LOGGER""http://org/apache/log4j/xml/log4j.dtd">
<log4j:configuration><appender name="myConsole" class="org.apache.log4j.ConsoleAppender"><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern"value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>layout><filter class="org.apache.log4j.varia.LevelRangeFilter"><param name="levelMin" value="debug" /><param name="levelMax" value="warn" /><param name="AcceptOnMatch" value="true" />filter>appender><appender name="myFile" class="org.apache.log4j.DailyRollingFileAppender"><param name="File" value="D:/Java/ProjectJ/myLog/myLogDebug.log"/><param name="Append" value="true"/><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern"value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>layout>appender><appender name="myFile2" class="org.apache.log4j.RollingFileAppender"><param name="File" value="D:/Java/ProjectJ/myLog/myLogInfo.log" /><param name="Append" value="true" /><param name="MaxFileSize" value="1mb"/><param name="MaxBackupIndex" value="2" /><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="%p (%c:%L)- %m%n" />layout>appender><category name="org.springframework"><param name="additivity" value="false"/><priority value="info"/><appender-ref ref="myFile2"/>category><category name="com.alibaba.druid.pool.DruidDataSource"><priority value="warn"/><appender-ref ref="myConsole"/>category><root><priority value="debug"/><appender-ref ref="myConsole"/><appender-ref ref="myFile"/><appender-ref ref="myFile2"/>root>
log4j:configuration>


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部