日志框架 - 基于spring-boot - 设计

简介: 日志框架系列讲解文章日志框架 - 基于spring-boot - 使用入门日志框架 - 基于spring-boot - 设计日志框架 - 基于spring-boot - 实现1 - 配置文件日志框架 - 基于spring-boot - 实现2 - 消...

日志框架系列讲解文章
日志框架 - 基于spring-boot - 使用入门
日志框架 - 基于spring-boot - 设计
日志框架 - 基于spring-boot - 实现1 - 配置文件
日志框架 - 基于spring-boot - 实现2 - 消息定义及消息日志打印
日志框架 - 基于spring-boot - 实现3 - 关键字与三种消息解析器
日志框架 - 基于spring-boot - 实现4 - HTTP请求拦截
日志框架 - 基于spring-boot - 实现5 - 线程切换
日志框架 - 基于spring-boot - 实现6 - 自动装配

在前文 日志框架 - 基于spring-boot - 使用入门 中,我介绍了日志框架的使用。

但读者看到了可能云里雾里的,因为没有代码也没有设计说明。所以你猜的没错!这一次就要来向各位观众揭示这小玩意里面的道道。

源起混乱的日志代码

前文已经解释过为什么要新造一个日志框架。
但我想靠文字不能有深切的体会。
下面是我在读别人代码时经常看到的代码:

logger.info("#{}#{}#{}#{}#{}", new String[]{
             orderInfo.getOrderNo() /*订单号*/, 
             orderInfo.getTradeCode() /*交易代码*/, 
             orderInfo.getReqSys() /*请求方系统*/, 
             orderInfo.getLocale() /*区域代码*/, 
             "req done" /*日志内容*/})

没有粗暴的用字符串相加,说明开发人员已经有一点水平了,但是……

这段代码意味着多糟糕的事情呢!?
写上面这段代码的可能是某个加班熬夜到神志模糊的程序员,更糟的是他借差迷糊劲把其中的两行写反了!
不对照着日志规范细扣,基本没有人能发现问题。

为了让WEB层的Controller与业务层的Service都能这样打印,Service层接口硬生生插入一个orderInfo,变成这样。

public void service(SomeThing toServed, OrderInfo orderInfo)

业务代码里面充斥着这样的代码,写的人不知疲倦,看的我心烦意乱了。
于是乎,我下定决心!要有一个日志框架,好好教人打日志

logger.info("req done" /*日志内容*/)

必须像上面这样写日志代码,其它的内容全部实现自动填充!

设计原则

好!现在就来开始动手设计理想中的框架。但是在动手之前,还需要想清楚两件事。

  1. 第一,要走的更远,需要站在巨人的肩膀上。我无意实现一个跟log4j与logback之类雷同的框架。要利用上log4j或logback的特性,最好能兼容它们俩。
  2. 第二,一个好用的框架要做到称手。要对普通开发人员透明,减少使用者的学习成本。

考虑到以上两点,并结合我们应用常见的开发场景,我最终选定这个框架基于spring-boot实现。因为spring-boot提供了众多实用的机制可供选择。享受spring-boot带来便利的同时,也为spring-boot做一些贡献,互利互惠。

基本概念

  1. 在我们系统中,一个应用经常能过HTTP或MQ与外部应用沟通,我把沟通的内容称为消息
  2. 消息中携带了许多关键信息,如前面提到的OrderNo、TradeCode等,需要被记录打印,我将其称为关键字
  3. 我将系统常用日志分为三类,分别是系统运行日志消息日志告警日志,它们各自输出到不同的文件中。它们会被采集分析,分别服务于运维人员、分析系统、监控系统。由于对接系统不同,因此它们有各自的日志格式定义。

总体设计

img_4e92267e5cc0321560e14c529b54128b.png
日志框架示意图

如图展示,里层绿色为应用层,指业务开发人员编写的业务代码;外层蓝色部分为框架层,包含日志框架的各个功能模块。

简单地说,日志框架有以下要点:

  1. 在请求进入业务层之前进行拦截,获得消息(Message)
  2. 根据关键字(Keyword),使用解析器(MessageResolver)提取消息(Message)中的值。关键字(Keyword)及其值保存于MDC之中。
  3. 打印日志时,将MDC中的值按格式自动填充到指定位置。
  4. 提供一个@MessageToLog注解,在函数上使用,将函数的返回值视作消息(Message),打印到消息日志中。
  5. 对系统运行日志,消息日志,告警日志三种不同的日志类型,有各自的追加器(Appender),分别写入到不同的文件中。

实现

具体代码实现,且听下回分解。

日志框架系列讲解文章
日志框架 - 基于spring-boot - 使用入门
日志框架 - 基于spring-boot - 设计
日志框架 - 基于spring-boot - 实现1 - 配置文件
日志框架 - 基于spring-boot - 实现2 - 消息定义及消息日志打印
日志框架 - 基于spring-boot - 实现3 - 关键字与三种消息解析器
日志框架 - 基于spring-boot - 实现4 - HTTP请求拦截
日志框架 - 基于spring-boot - 实现5 - 线程切换
日志框架 - 基于spring-boot - 实现6 - 自动装配

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
14天前
|
安全 Java 开发者
如何在Spring框架中实现横切关注点的集中管理和重用?
【4月更文挑战第30天】如何在Spring框架中实现横切关注点的集中管理和重用?
18 0
|
14天前
|
安全 Java 程序员
Spring框架的核心特性是什么?
【4月更文挑战第30天】Spring 的特性
17 0
|
3天前
|
XML Java 数据库连接
Spring框架与Spring Boot的区别和联系
Spring框架与Spring Boot的区别和联系
13 0
|
5天前
|
前端开发 安全 Java
使用Spring框架加速Java开发
使用Spring框架加速Java开发
44 0
|
5天前
|
设计模式 数据采集 监控
Spring日志框架
Spring日志框架
8 0
|
5天前
|
前端开发 Java 应用服务中间件
Spring MVC框架概述
Spring MVC 是一个基于Java的轻量级Web框架,采用MVC设计模型实现请求驱动的松耦合应用开发。框架包括DispatcherServlet、HandlerMapping、Handler、HandlerAdapter、ViewResolver核心组件。DispatcherServlet协调这些组件处理HTTP请求和响应,Controller处理业务逻辑,Model封装数据,View负责渲染。通过注解@Controller、@RequestMapping等简化开发,支持RESTful请求。Spring MVC具有清晰的角色分配、Spring框架集成、多种视图技术支持以及异常处理等优点。
12 1
|
13天前
|
XML Java Maven
Springboot整合与使用log4j2日志框架【详解版】
该文介绍了如何在Spring Boot中切换默认的LogBack日志系统至Log4j2。首先,需要在Maven依赖中排除`spring-boot-starter-logging`并引入`spring-boot-starter-log4j2`。其次,创建`log4j2-spring.xml`配置文件放在`src/main/resources`下,配置包括控制台和文件的日志输出、日志格式和文件切分策略。此外,可通过在不同环境的`application.yml`中指定不同的log4j2配置文件。最后,文章提到通过示例代码解释了日志格式中的各种占位符含义。
|
13天前
|
SQL Java 数据库连接
Springboot框架整合Spring JDBC操作数据
JDBC是Java数据库连接API,用于执行SQL并访问多种关系数据库。它包括一系列Java类和接口,用于建立数据库连接、创建数据库操作对象、定义SQL语句、执行操作并处理结果集。直接使用JDBC涉及七个步骤,包括加载驱动、建立连接、创建对象、定义SQL、执行操作、处理结果和关闭资源。Spring Boot的`spring-boot-starter-jdbc`简化了这些步骤,提供了一个在Spring生态中更便捷使用JDBC的封装。集成Spring JDBC需要添加相关依赖,配置数据库连接信息,并通过JdbcTemplate进行数据库操作,如插入、更新、删除和查询。
|
13天前
|
SQL Java 数据库连接
Springboot框架整合Spring Data JPA操作数据
Spring Data JPA是Spring基于ORM和JPA规范封装的框架,简化了数据库操作,提供增删改查等接口,并可通过方法名自动生成查询。集成到Spring Boot需添加相关依赖并配置数据库连接和JPA设置。基础用法包括定义实体类和Repository接口,通过Repository接口可直接进行数据操作。此外,JPA支持关键字查询,如通过`findByAuthor`自动转换为SQL的`WHERE author=?`查询。
|
14天前
|
安全 Java 开发者
在Spring框架中,IoC和AOP是如何实现的?
【4月更文挑战第30天】在Spring框架中,IoC和AOP是如何实现的?
22 0