【翻译】spring-boot日志相关梳理(二)之slf4j入门

目录

HelloWorld

流式使用api(Fluent Logging API)

和其他的日志框架绑定

常见的FAQ:


spring-boot日志相关梳理(-)里提到slf4j系列,因为后续的很多日志框架都依赖于它,重点看看slf4j.

slf4j官方文档:http://www.slf4j.org/docs.html

用户手册:http://www.slf4j.org/manual.html

HelloWorld

1.建议maven项目 slf4j,pom中添加依赖

<properties>
        <slf4j.version>1.7.28</slf4j.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
    </dependencies>

2.创建如下类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

a> 没有引入任何实现依赖-->丢弃日志

直接运行HelloWorld,输出如下:

原因:LoggerFactory.bind()

b> slf4j-simple 依赖

 修改pom文件

  <properties>
        <slf4j.version>1.7.28</slf4j.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
    </dependencies>

运行HelloWorld

自定义配置:

配置文件位置:src/main/resources/simplelogger.properties

文件内容

org.slf4j.simpleLogger.logFile=simple.log
org.slf4j.simpleLogger.defaultLogLevel=info

重新运行HelloWorld, 发现输出到根目录下simple.log文件中

配置解析可以参考:SimpleLoggerConfiguration; 优先参考SystemProperties, 其次simplelogger.properties

经典语法

使用占位符方式传递参数, 详细细节:http://www.slf4j.org/faq.html#logging_performance

        logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

流式使用api(Fluent Logging API)

ps:SLF4J API version 2.0.0 以后才可以:https://repo1.maven.org/maven2/org/slf4j/

修改pom文件

<properties>
        <slf4j.version>2.0.0-alpha1</slf4j.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
    </dependencies>

修改Java代码:

public class HelloWorld {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(HelloWorld.class);
        logger.atInfo().log("Hello World,{}", print("fluent info"));
        logger.atDebug().log("Hello World,{}", print("fluent debug "));
        logger.atDebug().addArgument(() -> print("fluent debug argument")).log("Hello World,{}");
        logger.info("Hello World,{}", print("info"));
        logger.debug("Hello World,{}", print("debug"));
    }

    private static String print(String message) {
        System.out.println(message);
        return message;
    }
}

运行HelloWorld,输出:

随着参数的增多,fluent 的优越性就体现出来了

和其他的日志框架绑定

1. log4j version 1.2

pom文件

    <properties>
        <slf4j.version>1.7.28</slf4j.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <!--绑定log4j version1.2-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
   </dependencies>

2.java.util.logging,也叫jdk1.4logging

修改pom文件

    <properties>
        <slf4j.version>1.7.28</slf4j.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
   </dependencies>

3.绑定 NOP, 默认丢弃所有日志

    <properties>
        <slf4j.version>1.7.28</slf4j.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
   </dependencies>

4.Binding for Jakarta Commons Logging,把所有slf4j日志代理给JCL

    <properties>
        <slf4j.version>1.7.28</slf4j.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jcl</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
   </dependencies>

5.绑定logback : 因为slf4j和logback的作者属于同一人,原生两者就是相互支持的,不用再做转换

    <properties>
        <slf4j.version>1.7.28</slf4j.version>
        <logback.version>1.7.28</logback.version>

    </properties>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>
   </dependencies>

 

常见的FAQ:

 1. slf4j和common log :http://www.slf4j.org/faq.html#yet_another_facade

   common-log 和slf4j的定位都是日志相关接口,但是两者实现理念不同

 slf4j存在的原因:(1) slf4j设计理念简单; (2) 引入两个新特性:日志参数化(有助于改善日志的性能);Marker Objects [算是对象的插拔渲染吧,个人理解]

2. 如何获取slf4j和对应日志的绑定关系

3.如何高效的打印日志:http://www.slf4j.org/faq.html#logging_performance

 a> 直接拼接字符串

logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));

b> 先判断日志级别:

if(logger.isDebugEnabled()) {
  logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}

c> 参数化 (性能至少比a好30倍)

Object entry = new SomeObject();
logger.debug("The entry is {}.", entry);

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Spring Cloud 中集成 Log4j2 日志框架,可以通过添加以下依赖项来实现: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-stream</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-rabbit</artifactId> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>${log4j.version}</version> </dependency> ``` 然后在 `application.properties` 文件中添加以下配置: ``` spring.cloud.stream.bindings.output.destination=myTopic spring.sleuth.sampler.probability=1.0 logging.level.org.springframework.cloud.stream=DEBUG logging.level.org.springframework.integration=DEBUG logging.level.org.springframework.amqp=DEBUG spring.cloud.stream.bindings.input.destination=myTopic spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.zipkin.baseUrl=http://localhost:9411 ``` 这里的配置包括了日志的级别以及 Sleuth 和 Zipkin 的配置。最后,可以使用以下代码来测试日志输出: ```java @Slf4j @RestController @RequestMapping("/api") public class DemoController { @GetMapping("/test") public String test() { log.debug("This is a debug message"); log.info("This is an info message"); log.warn("This is a warning message"); log.error("This is an error message"); return "Test"; } } ``` 如果一切顺利,你应该能够在控制台看到输出的日志信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值