jcl与jul log4j1 log4j2 logback日志系统机制及集成原理

目录
  • apache commons-logging
    • 1 简单的使用案例
    • 2 使用原理
      • 1 获取LogFactory的过程
      • 2 根据LogFactory获取Log的过程
  • commons-logging与jul集成
    • 1 需要的jar包
    • 2 使用案例
    • 3 使用案例分析
      • 1 获取获取LogFactory的过程
      • 2 根据LogFactory获取Log的过程
  • commons-logging与log4j1集成
    • 1 需要的jar包
    • 4.2 使用案例
    • 3 使用案例分析
      • 1 获取获取LogFactory的过程
      • 2 根据LogFactory获取Log的过程
  • commons-logging与log4j2集成
    • 1 需要的jar包
    • 2 使用案例
    • 3 使用案例分析
      • 1 先来看下上述 log4j-jcl(log4j2与commons-logging的集成包)的来历:
      • 2 获取获取LogFactory的过程
      • 3 根据LogFactory获取Log的过程
  • commons-logging与logback集成
    • 需要的jar包
    • 2 使用案例
    • 3 使用案例分析
      • 1 先看下jcl-over-slf4j都有哪些内容(它可以替代了commons-logging)
      • 2 获取获取LogFactory的过程
      • 3 根据LogFactory获取Log的过程
  • 结尾

系列文章已完成,目录如下:

jdk-logging log4j logback日志系统实现机制原理介绍

slf4j与jul、log4j1、log4j2、logback的集成原理

slf4j、jcl、jul、log4j1、log4j2、logback大总结

前面介绍了jdk自带的logging、log4j1、log4j2、logback等实际的日志框架

对于开发者而言,每种日志都有不同的写法。如果我们以实际的日志框架来进行编写,代码就限制死了,之后就很难再更换日志系统,很难做到无缝切换。

java web开发就经常提到一项原则:面向接口编程,而不是面向实现编程

所以我们应该是按照一套统一的API来进行日志编程,实际的日志框架来实现这套API,这样的话,即使更换日志框架,也可以做到无缝切换。

这就是commons-logging与slf4j的初衷。

下面就来介绍下commons-logging与slf4j这两个门面如何与上述四个实际的日志框架进行集成的呢

介绍之前先说明下日志简称:

jdk自带的logging->简称 jul (java-util-logging)

apache commons-logging->简称 jcl

apache commons-logging

先从一个简单的使用案例来说明

1 简单的使用案例

private static Log logger=LogFactory.getLog(JulJclTest.class);
public static void main(String[] args){
	if(logger.isTraceEnabled()){
		logger.trace("commons-logging-jcl trace message");
	}
	if(logger.isDebugEnabled()){
		logger.debug("commons-logging-jcl debug message");
	}
	if(logger.isInfoEnabled()){
		logger.info("commons-logging-jcl info message");
	}
}

上述Log、LogFactory都是commons-logging自己的接口和类

2 使用原理

LogFactory.getLog(JulJclTest.class)的源码如下:

public static Log getLog(Class clazz) throws LogConfigurationException {
    return getFactory().getInstance(clazz);
}

上述获取Log的过程大致分成2个阶段

  • 获取LogFactory的过程 (从字面上理解就是生产Log的工厂)
  • 根据LogFactory获取Log的过程

commons-logging默认提供的LogFactory实现:LogFactoryImpl commons-logging默认提供的Log实现:Jdk14Logger、Log4JLogger、SimpleLog。

来看下commons-logging包中的大概内容:

下面来详细说明:

1 获取LogFactory的过程

从下面几种途径来获取LogFactory

1.1 系统属性中获取,即如下形式

System.getProperty("org.apache.commons.logging.LogFactory")

1.2 使用java的SPI机制,来搜寻对应的实现

对于java的SPI机制,详细内容可以自行搜索,这里不再说明。搜寻路径如下:

META-INF/services/org.apache.commons.logging.LogFactory

简单来说就是搜寻哪些jar包中含有搜寻含有上述文件,该文件中指明了对应的LogFactory实现

1.3 从commons-logging的配置文件中寻找

commons-logging也是可以拥有自己的配置文件的,名字为commons-logging.properties,只不过目前大多数情况下,我们都没有去使用它。如果使用了该配置文件,尝试从配置文件中读取属性"org.apache.commons.logging.LogFactory"对应的值

1.4 最后还没找到的话,使用默认的org.apache.commons.logging.impl.LogFactoryImpl

LogFactoryImpl是commons-logging提供的默认实现

2 根据LogFactory获取Log的过程

这时候就需要寻找底层是选用哪种类型的日志

就以commons-logging提供的默认实现为例,来详细看下这个过程:

2.1 从commons-logging的配置文件中寻找Log实现类的类名

从commons-logging.properties配置文件中寻找属性为"org.apache.commons.logging.Log"对应的Log类名

2.2 从系统属性中寻找Log实现类的类名

即如下方式获取:

System.getProperty("org.apache.commons.logging.Log")

2.3 如果上述方式没找到,则从classesToDiscover属性中寻找

classesToDiscover属性值如下:

private static final String[] classesToDiscover = {
    "org.apache.commons.logging.impl.Log4JLogger",
    "org.apache.commons.logging.impl.Jdk14Logger",
    "org.apache.commons.logging.impl.Jdk13LumberjackLogger",
    "org.apache.commons.logging.impl.SimpleLog"
};

它会尝试根据上述类名,依次进行创建,如果能创建成功,则使用该Log,然后返回给用户。

下面针对具体的日志框架,看看commons-logging是如何集成的

commons-logging与jul集成

1 需要的jar包

commons-logging

对应的maven依赖是:

<dependency>
	<groupId>commons-logging</groupId>
	<artifactId>commons-logging</artifactId>
	<version>1.2</version>
</dependency>

2 使用案例

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

public static void main(String[] args){
	if(logger.isTraceEnabled()){
		logger.trace("commons-logging-jcl trace message");
	}
	if(logger.isDebugEnabled()){
		logger.debug("commons-logging-jcl debug message");
	}
	if(logger.isInfoEnabled()){
		logger.info("commons-logging-jcl info message");
	}
}

结果输出如下:

四月 27, 2015 11:13:33 下午 com.demo.log4j.JulJclTest main
信息: commons-logging-jcl info message

3 使用案例分析

案例过程分析,就是看看上述commons-logging的在执行原理的过程中是如何来走的

1 获取获取LogFactory的过程

所以commons-logging会使用默认的LogFactoryImpl作为LogFactory

  • 1.1 我们没有配置系统属性"org.apache.commons.logging.LogFactory"
  • 1.2 我们没有配置commons-logging的commons-logging.properties配置文件
  • 1.3 也没有含有"META-INF/services/org.apache.commons.logging.LogFactory"路径的jar包

2 根据LogFactory获取Log的过程

所以就需要依次根据classesToDiscover中的类名称进行创建。

2.1 我们没有配置commons-logging的commons-logging.properties配置文件

2.2 我们没有配置系统属性"org.apache.commons.logging.Log"

2.3 先是创建org.apache.commons.logging.impl.Log4JLogger

创建失败,因为该类是依赖org.apache.log4j包中的类的

2.4 接着创建org.apache.commons.logging.impl.Jdk14Logger

创建成功,所以我们返回的就是Jdk14Logger,看下它是如何与jul集成的

它内部有一个java.util.logging.Logger logger属性,所以Jdk14Logger的info("commons-logging-jcl info message")操作都会转化成由java.util.logging.Logger来实现:

上述logger的来历:

logger = java.util.logging.Logger.getLogger(name);

就是使用jul原生的方式创建的一个java.util.logging.Logger,参见jdk-logging的原生写法

是如何打印info信息的呢?

使用jul原生的方式:

logger.log(Level.WARNING,"commons-logging-jcl info message");

由于jul默认的级别是INFO级别(见上一篇文章的说明中的配置文件jdk自带的logging),所以只打出了如下信息:

四月 27, 2015 11:41:24 下午 com.demo.log4j.JulJclTest main
信息: commons-logging-jcl info message

原生的jdk的logging的日志级别是FINEST、FINE、INFO、WARNING、SEVERE分别对应我们常见的trace、debug、info、warn、error。

commons-logging与log4j1集成

1 需要的jar包

commons-logging

log4j

对应的maven依赖是:

<dependency>
	<groupId>commons-logging</groupId>
	<artifactId>commons-logging</artifactId>
	<version>1.2</version>
</dependency>
<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.17</version>
</dependency>

4.2 使用案例

在类路径下加入log4j的配置文件log4j.properties

log4j.rootLogger = trace, console
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} %m%n

使用方式如下:

private static Log logger=LogFactory.getLog(Log4jJclTest.class);
public static void main(String[] args){
	if(logger.isTraceEnabled()){
		logger.trace("commons-logging-log4j trace message");
	}
	if(logger.isDebugEnabled()){
		logger.debug("commons-logging-log4j debug message");
	}
	if(logger.isInfoEnabled()){
		logger.info("commons-logging-log4j info message");
	}
}

代码没变,还是使用commons-logging的接口和类来编程,没有log4j的任何影子。这样,commons-logging就与log4j集成了起来,我们可以通过log4j的配置文件来控制日志的显示级别

上述是trace级别(小于debug),所以trace、debug、info的都会显示出来

3 使用案例分析

案例过程分析,就是看看上述commons-logging的在执行原理的过程中是如何来走的:

1 获取获取LogFactory的过程

同上述jcl的过程一样,使用默认的LogFactoryImpl作为LogFactory

2 根据LogFactory获取Log的过程

同上述jcl的过程一样,最终会依次根据classesToDiscover中的类名称进行创建:

先是创建org.apache.commons.logging.impl.Log4JLogger

创建成功,因为此时含有log4j的jar包,所以返回的是Log4JLogger,我们看下它与commons-logging是如何集成的:

它内部有一个org.apache.log4j.Logger logger属性,这个是log4j的原生Logger。所以Log4JLogger都是委托这个logger来完成的

2.1 org.apache.log4j.Logger logger来历

org.apache.log4j.Logger.getLogger(name)

使用原生的log4j1的写法来生成,参见之前log4j原生的写法log4j1原生的写法,我们知道上述过程会引发log4j1的配置文件的加载,之后就进入log4j1的世界了

2.2 输出日志

测试案例中我们使用commons-logging输出的日志的形式如下(这里的logger是org.apache.commons.logging.impl.Log4JLogger类型):

logger.debug("commons-logging-log4j debug message");

其实就会转换成log4j原生的org.apache.log4j.Logger对象(就是上述获取的org.apache.log4j.Logger类型的logger对象)的如下输出:

logger.debug("log4j debug message");

上述过程最好与log4j1的原生方式对比着看,见log4j1的原生方式

commons-logging与log4j2集成

1 需要的jar包

commons-logging

log4j-api (log4j2的API包)

log4j-core (log4j2的API实现包)

log4j-jcl (log4j2与commons-logging的集成包)

对应的maven依赖是:

<dependency>
	<groupId>commons-logging</groupId>
	<artifactId>commons-logging</artifactId>
	<version>1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-core</artifactId>
	<version>2.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-jcl</artifactId>
    <version>2.2</version>
</dependency>

2 使用案例

编写log4j2的配置文件log4j2.xml,简单如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="debug">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

使用案例如下:

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

public static void main(String[] args){
	if(logger.isTraceEnabled()){
		logger.trace("commons-logging-log4j trace message");
	}
	if(logger.isDebugEnabled()){
		logger.debug("commons-logging-log4j debug message");
	}
	if(logger.isInfoEnabled()){
		logger.info("commons-logging-log4j info message");
	}
}

仍然是使用commons-logging的Log接口和LogFactory来进行编写,看不到log4j2的影子。但是这时候含有上述几个jar包,log4j2就与commons-logging集成了起来。

3 使用案例分析

案例过程分析,就是看看上述commons-logging的在执行原理的过程中是如何来走的:

1 先来看下上述 log4j-jcl(log4j2与commons-logging的集成包)的来历:

我们知道,commons-logging原始的jar包中使用了默认的LogFactoryImpl作为LogFactory,该默认的LogFactoryImpl中的classesToDiscover(到上面查看它的内容)并没有log4j2对应的Log实现类。所以我们就不能使用这个原始包中默认的LogFactoryImpl了,需要重新指定一个,并且需要给出一个apache的Log实现(该Log实现是用于log4j2的),所以就产生了log4j-jcl这个jar包,来看下这个jar包的大致内容:

这里面的LogFactoryImpl就是要准备替换commons-logging中默认的LogFactoryImpl(其中META-INF/services/下的那个文件起到重要的替换作用,下面详细说)

这里面的Log4jLog便是针对log4j2的,而commons-logging中的原始的Log4JLogger则是针对log4j1的。它们都是commons-logging的Log接口的实现

2 获取获取LogFactory的过程

这个过程就和jul、log4j1的集成过程不太一样了。通过java的SPI机制,找到了org.apache.commons.logging.LogFactory对应的实现,即在log4j-jcl包中找到的,其中META-INF/services/org.apache.commons.logging.LogFactory中的内容是:

org.apache.logging.log4j.jcl.LogFactoryImpl

即指明了使用log4j-jcl中的LogFactoryImpl作为LogFactory

3 根据LogFactory获取Log的过程

就来看下log4j-jcl中的LogFactoryImpl是怎么实现的

public class LogFactoryImpl extends LogFactory {
	private final LoggerAdapter<Log> adapter = new LogAdapter();
	//略
}

这个LoggerAdapter是lo4j2中的一个适配器接口类,根据log4j2生产的原生的org.apache.logging.log4j.Logger实例,将它包装成你指定的泛型类。

这里使用的LoggerAdapter实现是LogAdapter,它的内容如下:

public class LogAdapter extends AbstractLoggerAdapter<Log> {
    @Override
    protected Log newLogger(final String name, final LoggerContext context) {
        return new Log4jLog(context.getLogger(name));
    }
    @Override
    protected LoggerContext getContext() {
        return getContext(ReflectionUtil.getCallerClass(LogFactory.class));
    }
}

我们可以看到,它其实就是将原生的log4j2的Logger封装成Log4jLog。这里就可以看明白了,下面来详细的走下流程,看看是什么时候来初始化log4j2的:

至此,我们通过Log4jLog实例打印的日志都是委托给了它内部包含的log4j2的原生Logger对象了。

3.1 首先获取log4j2中的重要配置对象LoggerContext,LogAdapter的实现如上面的源码(使用父类的getContext方法),父类方法的内容如下:

LogManager.getContext(cl, false);

我们可以看到这其实就是使用log4j2的LogManager进行初始化的,至此就进入log4j2的初始化的世界了。

3.2 log4j2的LoggerContext初始化完成后,该生产一个log4j2原生的Logger对象

使用log4j2原生的方式:

context.getLogger(name)

3.3 将上述方式产生的Log4j原生的Logger实例进行包装,包装成Log4jLog

new Log4jLog(context.getLogger(name));

上述过程最好与log4j2的原生方式对比着看,见log4j2的原生方式

commons-logging与logback集成

需要的jar包

jcl-over-slf4j (替代了commons-logging,下面详细说明)

slf4j-api

logback-core

logback-classic

对应的maven依赖是:

<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>jcl-over-slf4j</artifactId>
	<version>1.7.12</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.7.12</version>
</dependency>
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-core</artifactId>
	<version>1.1.3</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.3</version>
</dependency>

2 使用案例

首先在类路径下编写logback的配置文件logback.xml,简单如下:

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

使用方式:

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

public static void main(String[] args){
	if(logger.isTraceEnabled()){
		logger.trace("commons-logging-jcl trace message");
	}
	if(logger.isDebugEnabled()){
		logger.debug("commons-logging-jcl debug message");
	}
	if(logger.isInfoEnabled()){
		logger.info("commons-logging-jcl info message");
	}
}

完全是用commons-logging的API来完成日志编写

3 使用案例分析

logback本身的使用其实就和slf4j绑定了起来,现在要想指定commons-logging的底层log实现是logback,则需要2步走

  • 第一步: 先将commons-logging底层的log实现转向slf4j (jcl-over-slf4j干的事)
  • 第二步: 再根据slf4j的选择底层日志原理,我们使之选择上logback

这样就可以完成commons-logging与logback的集成。即写着commons-logging的API,底层却是logback来进行输出

然后来具体分析下整个过程的源码实现:

1 先看下jcl-over-slf4j都有哪些内容(它可以替代了commons-logging)

如下图

这就是jcl-over-slf4j的大致内容

这里可以与commons-logging原生包中的内容进行下对比。原生包中的内容如下:

1.1 commons-logging中的Log接口和LogFactory类等

这是我们使用commons-logging编写需要的接口和类

1.2 去掉了commons-logging原生包中的一些Log实现和默认的LogFactoryImpl

只有SLF4JLog实现和SLF4JLogFactory

2 获取获取LogFactory的过程

jcl-over-slf4j包中的LogFactory和commons-logging中原生的LogFactory不一样,jcl-over-slf4j中的LogFactory直接限制死,是SLF4JLogFactory,源码如下:

public abstract class LogFactory {
	static LogFactory logFactory = new SLF4JLogFactory();
	//略
}

3 根据LogFactory获取Log的过程

这就需要看下jcl-over-slf4j包中的SLF4JLogFactory的源码内容:

Log newInstance;
Logger slf4jLogger = LoggerFactory.getLogger(name);
if (slf4jLogger instanceof LocationAwareLogger) {
    newInstance = new SLF4JLocationAwareLog((LocationAwareLogger) slf4jLogger);
} else {
    newInstance = new SLF4JLog(slf4jLogger);
}

可以看到其实是用slf4j的LoggerFactory先创建一个slf4j的Logger实例(这其实就是单独使用logback的使用方式,见logback原生案例)。

然后再将这个Logger实例封装成common-logging定义的Log接口实现,即SLF4JLog或者SLF4JLocationAwareLog实例。

所以我们使用的commons-logging的Log接口实例都是委托给slf4j创建的Logger实例(slf4j的这个实例又是选择logbakc后产生的,即slf4j产生的Logger实例最终还是委托给logback中的Logger的)

结尾

这篇讲解commons-logging与jul、log4j1、log4j2、logback的集成原理,内容很长了,就把slf4j与上述四者的集成放到下一篇文章,更多关于jcl与jul log4j1 log4j2 logback日志系统集成的资料请关注我们其它相关文章!

(0)

相关推荐

  • Logback与Log4j2日志框架性能对比与调优方式

    目录 前言 性能测试 logback 同步日志 异步日志(队列扩容) 异步日志(半队列扩容) log4j2 同步日志 异步日志(队列扩容) 异步日志(日志淘汰策略) 异步日志(半队列扩容) 异步日志(等待策略) 性能调优 异步日志 日志可靠性 Logback Log4j2 日志抛弃策略 Log4j2 Logback 日志等待策略 TimeoutWaitStrategy YieldWaitStrategy 队列容量 Logback Log4j2 长度计算公式 消费瓶颈 消费TPS 请求TPS 消费

  • log4j升级log4j2遇到的问题及解决方式

    目录 log4j升级log4j2的问题 一.导入包 二.在src/main/resources下新建一个log4j2.xml文件 升级log4j2遇到的那些坑 log4j升级log4j2的问题 一.导入包 <!-- log --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.ver

  • SpringBoot2 集成log4j2日志框架的实现

    前言 Log4j2是 Log4j 的进化版本,并提供了许多 Logback 可用的改进,同时解决了 Logback 体系结构中的一些固有问题.而且日志处理中我们会用到kafka作为日志管道.而kafka客户端依赖与Logback的兼容不是很完美,你可以选择排除依赖冲突或者使用Log4j2 . <!-- more --> 排除Logback依赖 Spring Boot 2.x默认使用Logback日志框架,要使用 Log4j2必须先排除 Logback. <dependency> &

  • Springboot整合log4j2日志全解总结

    在项目推进中,如果说第一件事是搭Spring框架的话,那么第二件事情就是在Sring基础上搭建日志框架,我想很多人都知道日志对于一个项目的重要性,尤其是线上Web项目,因为日志可能是我们了解应用如何执行的唯一方式. 在18年大环境下,更多的企业使用Springboot和Springcloud来搭建他们的企业微服务项目 ,此篇文章是博主在实践中用Springboot整合log4j2日志的总结. 常用日志框架 java.util.logging:是JDK在1.4版本中引入的Java原生日志框架 Lo

  • 老生常谈Log4j和Log4j2的区别(推荐)

    相信很多程序猿朋友对log4j都很熟悉,log4j可以说是陪伴了绝大多数的朋友开启的编程.我不知道log4j之前是用什么,至少在我的生涯中,是log4j带我开启的日志时代. log4j是Apache的一个开源项目,我们不去考究它的起源时间,但是据我了解,log4j 1已经不再更新了. 回顾log4j,曾给我们留下了多少的回忆,我记得早些年,那时候mybatis还是叫ibatis的时候,我为了配置ibatis控制台打印日志,纠结了多少个夜晚,最后配置出来时的那种喜悦感.废话不多说,下面我就以列举的

  • jcl与jul log4j1 log4j2 logback日志系统机制及集成原理

    目录 apache commons-logging 1 简单的使用案例 2 使用原理 1 获取LogFactory的过程 2 根据LogFactory获取Log的过程 commons-logging与jul集成 1 需要的jar包 2 使用案例 3 使用案例分析 1 获取获取LogFactory的过程 2 根据LogFactory获取Log的过程 commons-logging与log4j1集成 1 需要的jar包 4.2 使用案例 3 使用案例分析 1 获取获取LogFactory的过程 2

  • slf4j jcl jul log4j1 log4j2 logback各组件系统日志切换

    目录 各种jar包总结 slf4j转向某个实际的日志框架: 某个实际的日志框架转向slf4j: 集成总结 commons-logging与其他日志框架集成 slf4j与其他日志框架集成 日志系统之间的切换 log4j无缝切换到logback 1 案例 2 切换原理 jdk-logging无缝切换到logback 1 案例 切换原理 commons-logging切换到logback 使用案例 切换原理 常用的日志场景切换解释 1 左上图 2 右上图 3 左下图 冲突说明 jcl-over-slf

  • jdk-logging log4j logback日志系统实现机制原理介绍

    目录 1 需要解决的疑惑 2 jdk自带的logging 2.1 使用案例 2.2 简单过程分析: 3 log4j1 3.1 使用案例 3.1.1 需要的jar包 3.1.2 使用方式 3.2 获取Logger的原理 3.3 主要对象总结 4 log4j2 4.1 背景介绍 4.2 log4j2的使用案例 4.2.1 需要的jar包 4.2.2 使用方式 4.3 使用过程简单分析 4.4 主要对象总结 5 logback 5.1 使用案例 5.1.1 需要的jar包 5.1.2 使用方式 5.3

  • springboot项目配置logback日志系统的实现

    记录springboot项目配置logback日志文件管理: logback依赖jar包 SpringBoot项目配置logback理论上需要添加logback-classic依赖jar包: <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> <

  • slf4j与jul、log4j1、log4j2、logback的集成原理

    目录 slf4j 1 简单的使用案例 2 使用原理 1 获取ILoggerFactory的过程 2 根据ILoggerFactory获取Logger的过程 slf4j与jdk-logging集成 1 需要的jar包 2 使用案例 3 使用案例原理分析 1 获取ILoggerFactory的过程 2 根据ILoggerFactory获取Logger的过程 slf4j与log4j1集成 1 需要的jar包 2 使用案例 3 使用案例原理分析 1 获取对应的ILoggerFactory 2 根据ILo

  • 你真的懂java的日志系统吗

    目录 一.背景 二.详情 2.1.java自带的日志 2.2.log4j 2.3.logback 2.4.slf4j 2.5.JCL 三.总结 一.背景 在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志.经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发.调试过程中打印日志是常干的一件事,同时系统正常运行过程中必要的日志打印也是必须的. 二.详情 在笔者刚接触java程序的时候,打印日志经常使用到到下面的代码, System.ou

  • 浅谈Slf4j与其他日志系统兼容的使用方法

    java生产的各种框架(如spring等)里各个框架会使用不同的日志体系,多个不同日志在一个jvm里混搭会出现一定问题 ,这里梳理一下java体系里常见的日志框架,以SFL4j为中心介绍下跟各个日志框架的关系,介绍下生产环境如何打理各种日志框架. 1. 接口简介 在java的体系里,主要有slf4j和common-logging两种日志体系接口.实现的框架有很多,主流的诸如logback.log4j等. 当然,虽然都是接口,但两者也可以通过桥接包实现相互的日志代理输出. common-loggi

  • SpringBoot项目的logback日志配置(包括打印mybatis的sql语句)

    关于logback日志的详解见这位仁兄的博客:Spring Boot-日志配置(超详细) 我在这就开门见山直接介绍我们项目日志的配置使用吧!~ 1.基本介绍 默认情况下,Spring Boot项目就会用Logback来记录日志,并用INFO级别输出到控制台.如下图: 实际开发中我们不需要直接添加logback日志依赖. 你会发现 spring-boot-starter 其中包含了 spring-boot-starter-logging,该依赖内容就是 Spring Boot 默认的日志框架 lo

  • 解决springboot 2.x集成log4j2调试日志无法关闭的问题

    springboot2.x集成log4j2时,始终无法关闭log4j2自身的日志输出 已经做了如下配置: 在log4j2.xml的配置文件中,配置configuration的status属性为OFF: 确认系统所有地方无配置log4j2.debug: 如上配置都无法解决问题,只能从源码着手一探究竟. 从log4j2-api包中,找到StatusLogger,其设置日志输出level的代码如下: private StatusLogger(final String name,final Messag

  • springboot使用log4j2异步日志提升性能的实现方式

    目录 一.引入disruptor 二. 全局异步模式 三.异步/同步混合模式 同步日志的业务流程处理和日志打印是在同一个线程,日志打印的过程实际上是写文件IO的过程,这个过程是相对耗时的,并且会阻塞主线程的执行,只有日志打印完成后才会继续执行业务处理代码.如果日志量比较大,会影响主业务流程的处理效率.异步日志实现方式:将日志存入一个单独的队列中,有一个单独的线程从队列中获取日志并写入磁盘文件. 日志放入队列的耗时,肯定比磁盘写IO文件耗时要少的多得多,所以对主业务流程影响极小. 一个单独的线程进

随机推荐