springboot日志写入mysql_Springboot Log4j2 记录业务日志到数据库

Springboot Log4j2 记录业务日志到数据库

​ 之前写过博客介绍过如何在传统的SpringMVC or Struts2、Spring、Hibernate or Mybatis中使用log4j1.x来输出业务日志到数据库中完成低耦合的日志输出;最近把基础框架升级到Springboot2.x,顺带将该功能做了迁移。考虑到Log4j2在异步处理上性能高于log4j1.x,所以本次最终的选择是Springboot+log4j2。

为什么选择Log4j2

Springboot框架默认的日志实现是slf4j + logback。经过一番试用后发现logback在日志输出到数据库这个能力上相比较log4j2要稍微复杂点而且欠灵活;以前的版本是基于log4j1.x的经过一番评估和考虑最终决定使用slf4j+log4j2这套方案。

配置实战

Maven 依赖及排除

org.springframework.boot

spring-boot-starter-log4j2

com.lmax

disruptor

3.4.2

​这里有个坑我有义务给大家指出来;Springboot对各类日志框架都做了适配,可以根据用户引入的jar做自动选择;选择的时候也有优先级;具体原理我给大家推荐一篇文章:Springboot的Log日志系统详解 同类型的文章百度上非常多大家可以多找两篇看看。根据这一原理:我们首先要排除:spring-boot-starter-logging,再排除:logback-classic ,这时Springboot才去适配我们想要的log4j2。

​填坑:对于新手来说按照网上绝大多少的文章给的信息是无法完全排除这两个框架的;网上的是一个demo;我们实际项目中会集成很多的第三方框架;所以在排除的时候要找到你项目POM的依赖图或者依赖关系(不同的IDE查看方式不一样);去看看有哪些框架依赖导致了前面两个框架被间接依赖都需要进行排除。举例如下:

org.springframework.boot

spring-boot-starter-jdbc

logback-classic

ch.qos.logback

spring-boot-starter-logging

org.springframework.boot

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-logging

​上面的代码只是针对我的项目;你自己的项目引用可能更多;需要自己确认一下是不是完完整整的排除了两个优先级较高的日志框架。

Log4j2 配置文件

​配置文件是核心,我直接贴出全部配置文件,对其中的一个小坑进行预警:

class="com.sitech.bds.portal.log4j.extend.ConnectionFactoryConfig"

method="getDatabaseConnection"/>

Controller 日志记录

获取Logger:

// 导入的包是:org.slf4j.*

public static Logger LOG = LoggerFactory.getLogger(LogController.class);

记录日志:

LOG.info("日志列表导出");

设置模块中文名称

下面的代码放在每一个你需要记录日志的Controller中,例如:UserController、IndexController

@ModelAttribute

public void doString(){

MDC.put("operateModuleName","日志管理");

result.clear();

}

共性属性统一设置

对 IP、操作人这些每次都填充的属性;我创建了BaseController 给其他Controller集成;对共性值进行统一设置。

public class BaseController {

@Autowired

HttpServletRequest request;

Map result = new HashMap();

protected boolean flag;

protected String message;

@ModelAttribute

public void logInit(HttpServletRequest request_){

User user = (User)request_.getSession().getAttribute("user");

MDC.put("username",null!=user?user.getUsername():"anonymous");

MDC.put("clientIp", NetUtil.getIpAddr(request_));

MDC.put("operateResult", "success");

}

//其他代码都省略了

}

最终效果:

springboot日志写入mysql_Springboot Log4j2 记录业务日志到数据库_第1张图片

springboot日志写入mysql_Springboot Log4j2 记录业务日志到数据库_第2张图片

本文由 huzd 创作,采用 知识共享署名4.0 国际许可协议进行许可本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名最后编辑时间

为:

2020/07/14 15:58

你可能感兴趣的:(springboot日志写入mysql_Springboot Log4j2 记录业务日志到数据库)