slf4j日志引用正确姿势

Posted chengmuyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了slf4j日志引用正确姿势相关的知识,希望对你有一定的参考价值。

slf4j是为了便于不同日志框架的切换,而设计的日志系统门面,它支持的日志框架包括:java.util.logging, logback and log4j.它的使用很简单,只需要引入slf4j-api-${project.version}.jar即可,但实际项目中它需要配合相应的日志框架使用.这里只是简单介绍一下slf4j的引用.

1 使用slf4j需要的maven依赖

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>2.0.0-alpha1</version>
    </dependency>

2 引入maven依赖后需要在需要日志输出的类引入Logger
Logger logger = LoggerFactory.getLogger(HelloWorld.class);

示例代码:

package com.liu;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.invoke.MethodHandles;

public class HelloWorld {
    final static Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
    public static void main(String[] args) {
        logger.info("Hello World");
    }
}

执行结果:
技术图片
由于只有slf4j门面,无法输出具体的日志信息,只有对于的加载信息

如果想看到输出结果,引入门面后的具体日志框架即可,这里使用slf4j-simple作为示例:
maven依赖:

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>2.0.0-alpha1</version>
    </dependency>

执行结果:
[main] INFO com.liu.HelloWorld - Hello World

3 引入Logger有三种方式
a.类实例变量

public class HelloWorld {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
}

b.静态变量

public class HelloWorld {
    final static Logger logger = LoggerFactory.getLogger(HelloWorld.class);
}

因为不同类之间使用Logger都需要粘贴复制,同时修改映射的Logger名称,使用MethodHandles.lookup().lookupClass()方法可以获取到对应的类的class.
即: final static Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

c.lombok注解(这种也是静态变量方式,只是看着更简洁一些,它需要引入lombok依赖)

@Slf4j
public class HelloWorld {
}

<dependency>
???<groupId>org.projectlombok</groupId>
???<artifactId>lombok</artifactId>
???<version>1.16.16</version>
</dependency>

4 干货
前面说的都是基本用法,这里主要想说一下Logger引入方式中,官方之前是推荐使用静态变量方式的,但是现在根据情况有所区别:
a.静态变量方式
优点: 应用内共用;省CPU,主类初始化时,只需要一次分配;省内存;
缺点:1. 在应用间共享库,不能发挥仓库选择器优势.如果SLF4J绑定和底层API附带每一个应用(不在应用间分享),那么每个应用仍将有自己的日志环境。2.IOC不友善
b.实例变量方式
优点:当底层日志系统是logback-classic时,可发挥仓库选择器的优势,甚至应用间的共享库.
缺点:耗CPU;耗内存

参考资料:
slf4j官方对于相关问题解释 http://www.slf4j.org/faq.html
slf4j官方对于相关问题解释翻译 https://yq.aliyun.com/articles/86347
@Slf4j注解 https://projectlombok.org/api/lombok/extern/slf4j/Slf4j.html
@Slf4j注解作用 https://www.jianshu.com/p/6e137ee836a1
lombok日志相关注解及其作用 https://projectlombok.org/features/log






















以上是关于slf4j日志引用正确姿势的主要内容,如果未能解决你的问题,请参考以下文章

别在 Java 代码里乱打日志了,这才是打印日志的正确姿势!

前端开发的正确姿势——各种文件的目录结构规划及引用

编写日志的正确姿势

SpringBoot 日志的各种使用姿势,你真的用对了吗?

SpringBoot 日志的各种使用姿势,你真的用对了吗?

SpringBoot 日志的各种使用姿势,你真的用对了吗?