SpringBoot之Slf4j日志实现根据业务不同将日志写进不同的文件

背景:

        最近遇到一个工作业务需求:简单地将就是一个服务里面包含HTTP的入口服务,还包含TCP入口服务,这个时候正常情况下,我们使用@Slf4j的日志方式,会自动的将所有的日志写进一个文件,因为@Slf4j默认是按照系统日志进行写入,

这个时候就增加了我们后期的排查工作,因为如果出问题,或者有需求将所有的TCP入口的日志全部拉取出来这个时候,就会很麻烦,根据这个需求,我们采用Slf4可自定义的特性进行相关的配置,具体的配置使用如下:

 

1.  首先就是要写一个logback.xml的文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--    log日志存放路径 -->
    <springProperty name="LOG_PATH" source="logging.path" defaultValue="./logs"/>
    <!--自定义控制台日志格式-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder charset="UTF-8">
            <pattern>[%d{yyy-MM-dd HH:mm:ss.SSS}] [%thread] %-5level %logger{20} - [%method,%line] - %msg%n</pattern>
        </encoder>
    </appender>

    <!--系统INFO级别日志-滚动记录日志-->
    <appender name="SYS_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值-->
        <File>${LOG_PATH}/Main_info.log</File>
        <!--如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。-->
        <append>true</append>
        <!--级别过滤器(LevelFilter),此处只打INFO级别的日志-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <!--下面2个属性表示匹配规定level的接受打印,不匹配的(即非INFO)拒绝打印-->
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--设置滚动文件规则,如果直接使用 %d,默认格式是 yyyy-MM-dd-->
            <fileNamePattern>${log.LOG_PATH}/Main_info-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <!--保留5天的日志,5天的压缩文件是可以发现问题并且解决问题的最长时间-->
            <maxHistory>5</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--文件达到 最大128MB时会被压缩和切割 -->
                <maxFileSize>10 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>[%d{yyy-MM-dd HH:mm:ss.SSS}] [%thread] %-5level %logger{20} - [%method,%line] - %msg%n</pattern>
        </encoder>
    </appender>

    <!--系统ERROR级别日志-滚动记录日志-->
    <appender name="SYS_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_PATH}/Main_error.log</File>
        <append>true</append>
        <!--此处只打ERROR级别的日志-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--设置滚动文件规则,如果直接使用 %d,默认格式是 yyyy-MM-dd-->
            <fileNamePattern>${log.LOG_PATH}/Main_error-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <!--保留5天的日志,5天的压缩文件是可以发现问题并且解决问题的最长时间-->
            <maxHistory>5</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--文件达到 最大128MB时会被压缩和切割 -->
                <maxFileSize>10 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <encoder charset="UTF-8">
            <pattern>[%d{yyy-MM-dd HH:mm:ss.SSS}] [%thread] %-5level %logger{20} - [%method,%line] - %msg%n</pattern>
        </encoder>
    </appender>
    <!--业务TCPServer入口日志-->
    <appender name="TCPServer_Appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_PATH}/TCPServer入口.log</File>
        <append>true</append>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--设置滚动文件规则,如果直接使用 %d,默认格式是 yyyy-MM-dd-->
            <fileNamePattern>${log.LOG_PATH}/TCPServer入口-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <!--保留5天的日志,5天的压缩文件是可以发现问题并且解决问题的最长时间-->
            <maxHistory>5</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--文件达到 最大128MB时会被压缩和切割 -->
                <maxFileSize>10 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>[%d{yyy-MM-dd HH:mm:ss.SSS}] [%thread] %-5level %logger{20} - [%method,%line] - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--业务HTTPServer入口日志-->
    <appender name="HTTPServer_Appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_PATH}/HTTPServer入口.log</File>
        <append>true</append>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--设置滚动文件规则,如果直接使用 %d,默认格式是 yyyy-MM-dd-->
            <fileNamePattern>${log.LOG_PATH}/HTTPServer入口-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <!--保留5天的日志,5天的压缩文件是可以发现问题并且解决问题的最长时间-->
            <maxHistory>5</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--文件达到 最大128MB时会被压缩和切割 -->
                <maxFileSize>10 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>[%d{yyy-MM-dd HH:mm:ss.SSS}] [%thread] %-5level %logger{20} - [%method,%line] - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!-- 下面就是根据业务-->
    <logger name="TCPServer" additivity="false" level="INFO">
        <appender-ref ref="TCPServer_Appender"/>
    </logger>

    <logger name="HTTPServer" additivity="false" level="INFO">
        <appender-ref ref="HTTPServer_Appender"/>
    </logger>
    <!--info和error分开打印,注:ERROR > WARN > INFO > DEBUG > TRACE-->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="SYS_INFO"/>
        <appender-ref ref="SYS_ERROR"/>
    </root>

</configuration>

2. 使用就很简单了如上面我们主要分为3个业务:主业务,TCPServer入口业务,HTTPServer入口业务

分别讲解使用:

主业务的使用:就是使用最原始的@Slf4j的注解方式

@Slf4j
@Component
public class AService {

    public void fun(){
    
     log.info("{}","主业务日志使用");
     
    }
    
    }

TCPServer入口业务使用:首先就是不要使用@Slf4j的注解,然后就是在LoggerFactory中获取配置文件中定义的logger的业务名称


@Component
public class AService {

    private final Logger log = LoggerFactory.getLogger("TCPServer");
    
    public void fun1(){
    
     log.info("{}","msg");
     
    }
    
    }

HTTPServer入口业务使用:同上面的方式


@Component
public class AService {

    private final Logger log = LoggerFactory.getLogger("HTTPServer");
    
    public void fun1(){
    
     log.info("{}","msg");
     
    }
    
    }

3. 最后:

上面就是主要的使用,其实很简单,Slf4j已经为我们考虑了这种需求,所以我们只需要按照要求进行配置一下就可以了,如果有其他的问题,欢迎一起探讨。

 

 

 

 

 

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring Boot可以很方便地整合SLF4J日志框架,只需要在pom.xml文件中添加相应的依赖即可。具体步骤如下: 1. 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> ``` 2. 在application.properties文件中配置日志级别和输出格式,例如: ``` logging.level.root=INFO logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n ``` 3. 在代码中使用SLF4J进行日志输出,例如: ``` import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MyController { private static final Logger logger = LoggerFactory.getLogger(MyController.class); public void myMethod() { logger.info("This is a log message."); } } ``` 以上就是Spring Boot整合SLF4J日志的基本步骤。 ### 回答2: SLF4J是一个在Java应用程序中使用日志的简单抽象工具,它可以帮助开发者集成不同日志框架,如logback, log4j或java.util.logging。Spring Boot作为一种流行的Java框架,提供了丰富的工具来简化应用程序的开发,其中就包括日志记录。 在Spring Boot中,将SLF4J与其他日志框架整合非常简单。首先,我们需要在pom.xml文件中添加所需的依赖项,例如: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.30</version> </dependency> </dependencies> ``` 在这个例子中,我们添加了一个简单的依赖项,该依赖项将SLF4J与默认的Simple工厂一起使用,以便在控制台上记录日志消息。 接下来,我们需要在应用程序中使用SLF4J记录日志消息。这可以通过在我们的类中添加以下代码行来完成: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; @RestController public class MyController { private Logger logger = LoggerFactory.getLogger(MyController.class); @GetMapping("/hello") public String sayHello() { logger.info("Hello from SLF4J"); return "Hello"; } } ``` 在这个例子中,我们首先导入了Logger和LoggerFactory类。然后,我们在我们的控制器类中添加了一个Logger实例,该实例将我们的日志记录到控制台上。最后,我们在GetMapping方法中使用该实例记录一条信息。 当我们运行我们的应用程序并访问/hello端点时,我们将在控制台上看到以下输出: ``` 2021-10-01 12:00:00.000 INFO 12345 --- [nio-8080-exec-1] com.example.demo.MyController : Hello from SLF4J ``` 这就是整合过程的简单演示。通过这个简单的例子,我们可以轻松地在Spring Boot应用程序中使用SLF4J进行日志记录。最后,使用SLF4J可以帮助我们将应用程序与日志框架进行解耦,使我们的应用程序更加灵活和可维护。 ### 回答3: Spring Boot 是一种用于创建微服务的框架,它将应用程序所需的所有配置和依赖项打包在一起,以便快速轻松地开发和部署应用程序。在 Spring Boot 中整合 SLF4J 日志系统非常简单,只需要进行以下几个步骤: 1.在 pom.xml 文件中添加所需的依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> ``` spring-boot-starter-logging 包的作用是引入 Spring Boot 应用程序的默认日志记录器 Logback,而 slf4j-api 是 SLF4J 日志系统的 API 接口,logback-classic 则是具体的日志实现。 2.在 application.properties 文件中配置日志记录器的属性: ``` # 根日志级别 logging.level.root=INFO # 控制台的日志级别 logging.level.org.springframework.web=DEBUG # 日志文件的输出路径 logging.file=/var/log/myapplication.log ``` 在上面的例子中,我们设置根日志级别为 INFO,控制台日志级别为 DEBUG,并在 /var/log/myapplication.log 文件中输出日志。 3.在代码中使用 SLF4J 记录日志: ``` import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MyService { private static final Logger logger = LoggerFactory.getLogger(MyService.class); public void doSomething() { logger.debug("Doing something"); logger.info("Did something"); logger.error("Failed to do something"); } } ``` 在上面的代码中,我们使用了 SLF4J 的 getLogger() 方法来获取 MyService 类的日志记录器,然后使用 debug()、info() 和 error() 方法记录不同级别的日志。 通过上述步骤,我们就可以在 Spring Boot 应用程序中使用 SLF4J 记录日志了。值得注意的是,在开发调试时,可以将日志级别设置为 DEBUG,以便查看更详细的日志信息。而在生产环境中,应该将日志级别设置为 WARN 或 ERROR,以避免过多的日志输出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值