Spring如何按业务模块输出日志到不同的文件详解_第1页
Spring如何按业务模块输出日志到不同的文件详解_第2页
Spring如何按业务模块输出日志到不同的文件详解_第3页
Spring如何按业务模块输出日志到不同的文件详解_第4页
Spring如何按业务模块输出日志到不同的文件详解_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Spring如何按业务模块输出日志到不同的文件详解目录一、背景二、需求三、技术实现四、代码实现1、编写xml日志文件2、编写QQ模块的代码3、编写login模块的代码五、运行结果六、完整代码七、一个小知识点总结

一、背景

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

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

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

二、需求

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

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

2、第三方业务(QQ)模块的日志记录到springboot-qq.log文件中。

3、第三方业务(QQ)模块提供了一个login(loginName)方法,方法的入参loginName需要记录到springboot-qqLoginName.log文件中,模拟一、背景中提到的数据迁移失败,记录失败的数据到单独的日志文件中。

三、技术实现

1、采用的日志框架

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

2、如果实现分模块、分文件记录日志1、编写appender,这个可以简单的理解日志需要输出到哪里。

比如:

!--此处定义的日志输出到控制台--

appendername="stdout"

encoder

pattern%d{yyyy-MM-ddHH:mm:ss.SSS}[${PID:-}][%thread]%-5level%logger{50}#%method:%L-%msg%n/pattern

/encoder

/appender

!--此处定义日志输出到springboot-qq-日期.第几个.log文件中--

appendername="qqAppender"

rollingPolicy

fileNamePatternlogs/springboot-qq-%d{yyyy-MM-dd}-.%i.log/fileNamePattern

/rollingPolicy

/appender

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

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

!--在QQ这个包下的日志单独使用qqAppender来输出--

loggername="com.huan.springboot.qq"level="info"additivity="false"

appender-refref="qqAppender"/

appender-refref="stdout"/

/logger

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

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

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

注意:

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

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

MDC.put("CLASSNAME",QQService.class.getName());

qqLoginN("登录用户:[{}]",loginName);

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

四、代码实现

1、编写xml日志文件

1、编写appender

1、输出日志到控制台

appendername="stdout"

encoder

pattern%d{yyyy-MM-ddHH:mm:ss.SSS}[${PID:-}][%thread]%-5level%logger{50}#%method:%L-%msg%n/pattern

charsetUTF-8/charset

/encoder

/appender

2、编写login模板的日志

appendername="file"

rollingPolicy

fileNamePatternlogs/springboot-spring-%d{yyyy-MM-dd}-.%i.log/fileNamePattern

maxHistory7/maxHistory

maxFileSize1MB/maxFileSize

totalSizeCap2GB/totalSizeCap

/rollingPolicy

encoder

pattern%d{yyyy-MM-ddHH:mm:ss.SSS}[${PID:-}][%thread]%-5level%logger{50}#%method:%L-%msg%n/pattern

charsetUTF-8/charset

/encoder

/appender

3、编写qq模板的日志

appendername="qqAppender"

rollingPolicy

fileNamePatternlogs/springboot-qq-%d{yyyy-MM-dd}-.%i.log/fileNamePattern

maxHistory7/maxHistory

maxFileSize1MB/maxFileSize

totalSizeCap2GB/totalSizeCap

/rollingPolicy

encoder

pattern%d{yyyy-MM-ddHH:mm:ss.SSS}[${PID:-}][%thread]%-5level%logger{50}#%method:%L-%msg%n/pattern

charsetUTF-8/charset

/encoder

/appender

4、编写qq模块loginName单独输出到文件的日志

appendername="qqLoginNameAppender"

rollingPolicy

fileNamePatternlogs/springboot-qqLoginName-%d{yyyy-MM-dd}-.%i.log/fileNamePattern

maxHistory7/maxHistory

maxFileSize1MB/maxFileSize

totalSizeCap2GB/totalSizeCap

/rollingPolicy

encoder

pattern%d{yyyy-MM-ddHH:mm:ss.SSS}[${PID:-}][%thread]%-5level%X{CLASSNAME}#%method:%L-%msg%n/pattern

charsetUTF-8/charset

/encoder

/appender

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

1、配置login模块

rootlevel="INFO"

appender-refref="stdout"/

appender-refref="file"/

/root

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

2、配置qq模块

!--在QQ这个包下的日志单独使用qqAppender来输出--

loggername="com.huan.springboot.qq"level="info"additivity="false"

appender-refref="qqAppender"/

appender-refref="stdout"/

/logger

此处name的值直接指定到了qq的全包名路径。

3、配置loginName单独输出到文

!--将所有的QQ登录名防止在另外的文件中--

loggername="qqLoginName"level="info"additivity="false"

appender-refref="qqLoginNameAppender"/

appender-refref="stdout"/

/logger

2、编写QQ模块的代码

@Component

publicclassQQService{

privatestaticfinalLoggerlog=LoggerFactory.getLogger(QQService.class);

//getLogger("qqLoginName")里的qqLoginName需要和logback-spring.xml中logger的name一致,才会应用

privatestaticfinalLoggerqqLoginName=LoggerFactory.getLogger("qqLoginName");

publicvoidlogin(StringloginName){

("QQ业务:用户:[{}]开始使用QQ来登录系统",loginName);

MDC.put("CLASSNAME",QQService.class.getName());

qqLoginN("登录用户:[{}]",loginName);

3、编写login模块的代码

@RestController

publicclassLoginController{

privatestaticfinalLoggerlog=LoggerFactory.getLogger(LoginController.class);

@Resource

privateQQServiceqqService;

@GetMapping("login/{loginName}")

publicStringlogin(@PathVariable("loginName")StringloginName){

("自己业务:用户:[{}]进行登录",loginName);

qqService.l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论