当前位置: 首页>编程语言>正文

java log类型相乘 java logfactory

一:log4j,slf4j,logback


Commons-logging(桥接门面) :apache最早日志的门面接口。避免和具体的日志方案直接耦合。类似于JDBC 的api 接口,具体的的JDBC driver 实现由各数据库提供商实现。通过统一接口解耦


Slf4j(桥接门面): 全称为Simple Logging Facade for JAVA:日志门面。 是对不同日志框架提供的一个门面封装。可以在部署的时候不修改任何配置即可接入一种日志实现方案。和commons-loging 应该有一样的初衷



Log4j : 经典日志解决方案。内部把日志系统抽象封装成Logger 、appender 、pattern 等实现。我们可以通过配置文件轻松的实现日志系统的管理和多样化配置。


Logback : LOGBack 作为一个通用可靠、快速灵活的日志框架,将作为Log4j 的替代和SLF4J 组成新的日志系统的完整实现。官网上称具有极佳的性能,在执行速度是log4j 的10 倍,且内存消耗更少。



二、常见日志方案和注意事项


1.Commons-logging+log4j 


经典的一个日志实现方案。出现在各种框架里。如spring 、webx 、ibatis 等等。直接使用log4j 即可满足我们的日志方案。但是一般为了避免直接依赖具体的日志实现,一般都是结合commons-logging 来实现。常见代码如下:


import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

private static Log logger = LogFactory.getLog(CommonsLoggingTest.class);

代码上,没有依赖任何的log4j 内部的类。那么log4j 是如何被装载的?

Log 是一个接口声明。LogFactory 的内部会去装载具体的日志系统,并获得实现该Log 接口的实现类。而内部有一个Log4JLogger 实现类对Log 接口同时内部提供了对log4j logger 的代理。LogFactory 内部装载日志系统流程:

1.   首先,寻找org.apache.commons.logging.LogFactory 属性配置

2.   否则,利用JDK1.3 开始提供的service 发现机制,会扫描classpah 下的META-INF/services/org.apache.commons.logging.LogFactory 文件,若找到则装载里面的配置,使用里面的配置。

3.   否则,从Classpath 里寻找commons-logging.properties ,找到则根据里面的配置加载。

4.   否则,使用默认的配置:如果能找到Log4j 则默认使用log4j 实现,如果没有则使用JDK14Logger 实现,再没有则使用commons-logging 内部提供的SimpleLog 实现。

如果没有做任何配置,只要引入了log4j 并在classpath 配置了log4j.properties或者log4j.xml,则commons-logging 就会使log4j 使用正常,而代码里不需要依赖任何log4j 的代码。

2.Commons-logging+log4j+slf4j

如果在原有commons-logging 系统里,如果要迁移到slf4j, 使用slf4j 替换commons-logging ,也是可以做到的。原理使用到了上述commons-logging 加载的第二点。需要引入Org.slf4j.jcl-over-slf4j-1.5.6.jar 。这个jar 包提供了一个桥接,让底层实现是基于slf4j 。原理是在该jar 包里存放了配置META-INF/services/org.apache.commons.logging.LogFactory =org.apache.commons.logging.impl.SLF4JLogFactory,而commons-logging 在初始化的时候会找到这个serviceId ,并把它作为LogFactory 。

完成桥接后,那么那么简单日志门面SLF4J 内部又是如何来装载合适的log 呢?

原理是SLF4J 会在编译时会绑定import org.slf4j.impl.StaticLoggerBinder;

org.slf4j.slf4j-log4j12-1.5.6: 提供对 log4j 的一种适配实现。

Org.slf4j.slf4j-simple-1.5.6: 是一种 simple 实现,会将 log 直接打到控制台。

……

那么这个地方就要注意了:如果有任意两个实现slf4j 的包同时出现,那就有可能酿就悲剧,你可能会发现日志不见了、或都打到控制台了。原因是这两个jar 包里都有各自的org.slf4j.impl.StaticLoggerBinder ,编译时候绑定的是哪个是不确定的。这个地方要特别注意!!出现过几次因为这个导致日志错乱的问题。

需要jar包:

1. slf4j-api-1.5.11.jar 
2. slf4j-log4j12-1.5.11.jar 
3. log4j-1.2.15.jar 
4. log4j.properties(也可以是 log4j.xml,本例中用 log4j.propertes)

log4j.properties

log4j.appender.stdout=org.apache.log4j.ConsoleAppender  

log4j.appender.stdout.Target=System.out  

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  

log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n  

log4j.appender.db=org.apache.log4j.FileAppender  

log4j.appender.db.File=${s2sh.root}/WEB-INF/logs/ssh.log  

log4j.appender.db.Append=true  

log4j.appender.db.layout=org.apache.log4j.PatternLayout  

log4j.appender.db.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] - %m%n

3 SLF4J+LogBack

Logback 分为三个模块:logback-core,logback-classic,logback-access。logback-core 是核心;logback-classic 改善了 log4j,且自身实现了 SLF4J API,所以即使用 Logback 你仍然可以使用其他的日志实现,如原始的 Log4J,java.util.logging 等;logback-access 让你方便的访问日志信息,如通过 http 的方式

需要jar包:

slf4j-api-1.5.11.jar 
logback-core-0.9.20.jar 
logback-classic-0.9.20.jar 
logback.xml 或 logback-test.xml (类似于 log4j.properties/log4j.xml) 

Logback 先找 logback-test.xml,没有则找 logback.xml 文件,都找不到就使用 BasicConfigurator 基本配置,BasicConfigurator 就是相当于等会贴出的 logback.xml 文件内容的配置。这里我们用 logback.xml 配置文件,以前的 log4j.properties  文件可以用 PropertiesTranslator 转换成 logback.xml 文件内容

logback.xml: 
<?xml version="1.0" encoding="UTF-8"?> 
  <configuration> 
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">          
         <encoder charset="GBK"> 
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
         </encoder> 
     </appender>     
     <root level="DEBUG"> 
       <appender-ref ref="stdout" /> 
     </root> 
  </configuration>

两者使用slf4j代码一样没差别: 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
public class TestLogback { 
    private static final Logger logger = LoggerFactory.getLogger(TestLogback.class); 
   public static void main(String[] args) { 
        logger.info("Hello {}","TestLogback"); 
    } 
}


java log类型相乘 java logfactory,java log类型相乘 java logfactory_logback,第1张


https://www.xamrdz.com/lan/5sb1921841.html

相关文章: