Spring按业务模块输出日志到不同的文件

一、背景

在我们开发的过程中,可能存在如下情况:

1、 有些时候我们需要调用第三方的接口 ,一般情况下,调用接口,我们都会记录请求的入参和响应的。如果我们自己系统的日志和第三方的日志混合到一个日志文件中,那么可能查找日志就比较麻烦了。 那么我们是否可以将第三方系统的日志单独放到另外的文件中呢?

2、或者有些时候我们系统需要进行数据迁移,如果某条数据迁移失败了, 是否单独放到一个日志文件中比较清晰呢?

二、需求

从上图中可以看到我们的需求比较简单

1、系统启动日志和 login 模块日志记录到 springboot-spring.log 文件中。

三、技术实现

1、采用的日志框架

此处使用 logback 来完成日志的记录,因为 SpringBoot 应用程序默认的就是采用的logback来记录日志。

2、如果实现分模块、分文件记录日志

1、 编写 appender ,这个可以简单的理解日志需要输出到哪里。

比如:

2、如何实现模块输出日志

此处就需要我们来配置 logger 了。logger的 name 属性指定到具体的全包名,然后引用我们上面定义的 appender 即可。

配置logger,logger的name为需要单独生成文件的那个包的全包名,然后在里面引用上面定义的appender

3、如果实现将loginName输出到指定的文件

其实还是使用 logger 来实现,logger的 name 需要和 LoggerFactory.getLogger("此处写具体logger的name的值")

注意:

此处可能有一个坑,就是可能会丢失类名,那么我们如何进行解决呢?可以通过 MDC 来解决。

.... %X{CLASSNAME}#%method:%L -%msg%n

即 xml 中使用 %X{CLASSNAME} ,在 java 代码中使用 MDC 存入 CLASSNAME 的值。

四、代码实现

1、编写xml日志文件

1、编写appender

1、输出日志到控制台

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [${PID:- }] [%thread] %-5level %logger{50}#%method:%L -%msg%n</pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>

2、编写 login 模板的日志

<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/springboot-spring-%d{yyyy-MM-dd}-.%i.log</fileNamePattern>
            <maxHistory>7</maxHistory>
            <maxFileSize>1MB</maxFileSize>
            <totalSizeCap>2GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [${PID:- }] [%thread] %-5level %logger{50}#%method:%L -%msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

2、配置日志输出到具体位置

1、配置login模块

<root level="INFO">
    <appender-ref ref="stdout"/>
    <appender-ref ref="file"/>
</root>

login 模块属于我们自己的系统模块,此处使用 root 标签来配置。

3、配置loginName单独输出到文件

3、编写login模块的代码

五、运行结果

可以看到得到了我们期望的结果。

六、完整代码

七、一个小知识点

在SpringBoot中,如果我们要覆盖默认的logback配置,推荐使用 logback-spring.xml 来配置。

经验分享 程序员 微信小程序 职场和发展