spring cloud多模块项目框架搭建-集成SLF4J和log4j2日志组件

第七章  集成SLF4J和log4j2进行日志管理

本系列博客旨在搭建一套能用于实际开发使用的spring cloud多模块项目框架,并不是一个spring cloud的demo而已,提供分布式系统的开发规范限制,微服务注册中心,配置中心,负载均衡,熔断,redis缓存,分布式事务,kafka服务消息通信,系统安全(sql注入攻击,xxs攻击等等),多数据源切换,全局异常处理等等。

 目录顺风车:spring cloud多模块项目框架搭建https://blog.csdn.net/lingyancangqiong/article/details/109841353

SLF4J官网:http://www.slf4j.org/

开源中国SLF4J在线API文档:https://tool.oschina.net/apidocs/apidoc?api=slf4j

log4j2官网:http://logging.apache.org/log4j/2.x/

日志管理的重要性不用我多说了吧,还记得刚出来那会儿,没懂起日志的重要性,被老大一顿p,我现在公司有很多人也没有打日志的习惯,就连通过RPC调用别人系统也没打日志,也不知道这要调用失败了怎么扯得清楚,上线出了问题就只能干瞪眼?这里也告诫大家一句,必要的地方,一定要留好日志,特别是线上只能通过日志来复现当时的问题,但是日志也不能乱打,日志是通过io写入文件的,过量的日志会大幅拖慢系统性能。我们这套系统采用SLF4J和log4j2作为日志框架,并将日志分类保存。

一.   什么是SLF4J?

SLF4j并不是一个具体的日志框架,而是一个为日志抽象层,,使用了门面设计模式和桥接设计模式,为用户及各种log框架提供一系列统一,易用的接口。而你只需通过这一系列接口,去做具体的日志实现,从而减少后期维护成本,不约束系统为某一种日志形式,就拿日志框架来说,从最初的log4j到logback,再到如今的log4j2,我想切换更高效的日志框架时,就得去改整个系统的日志??SLF4J很好的避免了这个问题。反之,我写程序时也不用去管框架用的什么日志实现框架,怎么去输出日志,只需按SLF4J的接口及格式去输出日志即可。

二.   什么是log4J2,为什么要使用它??

首先我们得感谢这位大佬:Ceki Gülcü ,此处应该放一个大佬的头像,让我等瞻仰下,奈何百度图片没搜到。当今最好用的4个java日志框架log4j,logback和本文用到的SLF4J,log4j2都是出自这位大佬之手。 Java据说起初是没有日志类java.util.logging ,只能System.out.println();来打印。这时候大佬就出场了,设计开发了广为流行的log4j,并且表示sun公司可以把log4j纳入jdk,但是官方表示我不比你差,自己开发了功能差不多的java.util.logging日志工具类,但是并未影响到log4j的地位。

后来大佬又开发了logback.继承了log4j的一些优点,重写了内核,性能提升了10倍以上。这时候也出现了一些其他的日志框架,大佬又发现用户不管是从其他框架切换到log4j,logback不方便,从log4j换到logback也不方便,于是又设计开发了SLF4J,让用户只用按照一定的格式输出日志,而不用去关心切换时的影响,这和jvm的设计思想有异曲同工之妙,门面设计模式。

2015年,Apache宣布不再维护老年的log4j,建议用户切换到还是这位大佬开发的log4j2,性能上比logback又提升了6到7倍。此时我觉得不能再称为大佬,而是巨佬。

三.   集成SLF4j和log4j2

我们还是以上一章的代码为基础,dream-order为例,可以照着我的讲解先弄好dream-order系统,然后再自己去动手操作下dream-activity系统,这样才记得牢,说不定还会踩上一些小坑。

1. dream父模块的pom.xml引入SLF4j和log4j2的maven依赖,并排除掉spring boot默认的logback的jar包依赖,不然会产生冲突。

        <properties>
           <spring-boot-starter-log4j2.version>2.3.5.RELEASE</spring-boot-starter-log4j2.version>
            <slf4j-log4j12.version>2.0.0-alpha1</slf4j-log4j12.version>
        </properties>
        <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>${spring-boot-starter.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

             <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-log4j2 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-log4j2</artifactId>
                <version>${spring-boot-starter-log4j2.version}</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>${slf4j-log4j12.version}</version>
                <scope>test</scope>
            </dependency>

2.  在dream-order系统的pom.xml引入如下依赖

          <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-log4j2 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
            <version>${spring-boot-starter-log4j2.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j-log4j12.version}</version>
            <scope>test</scope>
        </dependency>

3.  在dream-order-web的resources下创建log4j2的配置文件log4j2.xml ,这里是进行日志分类和日志级别设置,注意其中配置的每个日志文件的名字,在自己动手配置dream-activity系统时一定要修改,不然就日志错乱了。

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="INFO" monitorInterval="30">
    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
        </console>
        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
        <File name="log" fileName="log/dream-order-test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>
        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/dream-order-info.log"
                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/dream-order-info-%d{yyyy-MM-dd}-%i.log">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/dream-order-warn.log"
                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/dram-order-warn-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
        <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/dream-order-error.log"
                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/dream-order-error-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
    </appenders>
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.springframework" level="INFO"></logger>
        <logger name="org.mybatis" level="INFO"></logger>
        <logger name="com.baomidou.mybatisplus" level="DEBUG"></logger>
        <root level="all">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>
</configuration>

4.  这样就把SLF4j和log4j集成好了,我们启动并打印下日志试试,我们直接使用前面集成的lombok的注解@Slf4j的注解就可以使用log了,不用通过loggerFactory工厂去声明。

 

5.   可以看到控制台日志都完美打印了,在我们配置的盘符下看到error.log,debug.log,info.log ,至于日志分类功能要满足我们配置的100M才能看的到,这里给大家看看我日常开发用的框架的产生的分类日志,下图中上面就是按月分类的,再进去就是按天的日志。

本章spring cloud多模块项目框架搭建-集成SLF4J和log4j日志组件到这里就全部结束了,你学会了吗?还是要多动手,光看看一会儿瞌睡都来了,自己把dream-activity集成了吧。😁😁😁😂

本章代码我放在了蓝奏云,可以下载下来对照对照:  (https://wws.lanzoux.com/b01hu3s5a      密码:h96s)

上面所写内容如有不足和纰漏,欢迎留言或私聊指正批评。如果需要转载,也是欢迎,不甚荣幸,但请把《spring cloud多模块项目框架搭建》这一系列博客全部一起转载,这一系列博客毕竟是个整体教程,如果别人只看到一部分,那就是个残次品,谢谢,鞠躬。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要在 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"; } } ``` 如果一切顺利,你应该能够在控制台看到输出的日志信息。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值