zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Codeforces Round #747 比赛记录(vp)
    神秘姿势:把 K(2n) 分解成 2n-1 组完美匹配
    Codeforces Round #745 比赛记录(vp)
    NOIP Camp #2 比赛记录
    数论 专题整理
    Java基础之流程控制语句
    Java基本类型
    开启学科模式
    Strange Queries (莫队+容斥原理)
    洛谷P1993 小K的农场
  • 原文地址:https://www.cnblogs.com/chengmuyu/p/12969484.html
Copyright © 2011-2022 走看看