当前位置: 首页 > news >正文

日志框架 - 基于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 - 自动装配

上一篇我们讲了日志框架实现的第一部分:配置文件
本篇讲日志框架实现的第二部分:消息定义及消息日志打印

消息定义

对于设计中提及的核心概念消息,代码中定义如下。

/**
 * 消息
 */
public class Message {
    
    private Object content;
    
    private MessageType type;
    
    public Object getContent() {
        return content;
    }
    
    public void setContent(Object content) {
        this.content = content;
    }
    
    public MessageType getType() {
        return type;
    }
    
    public void setType(MessageType type) {
        this.type = type;
    }
}

/**
 * 消息类型
 */
public enum MessageType {
    XML, JSON, KEY_VALUE, TEXT, NONE
}

消息日志的打印

在设计中讲到:提供一个@MessageToLog注解,在函数上使用,将函数的返回值视作消息(Message),打印到消息日志中。

消息日志的打印功能,主要由@MessageToLog注解结合SpringAOP方式实现。@MessageToLog注解定义如下。

/**
 * 在方法使用本注解,返回值会被视为报文记录到报文日志中。
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MessageToLog {

    String value() default "";

    String addition() default "";
}

然后定义切面与相应的操作,对使用了@MessageToLog的函数的返加回值进行额外操作,写入报文日志。代码如下。

/**
 * 针对MessageToLog注解的切面
 */
@Aspect
public class MessageToLogAspect {
    
    private static Logger logger =
            LoggerFactory.getLogger(MessageToLogAspect.class);
    
    private ObjectMapper mapper = new ObjectMapper();
    
    @AfterReturning(
            value = "@annotation(annotation)",
            returning = "message")
    public void doMessageToLog(MessageToLog annotation, Object message) {
        String messageText;
        if (message instanceof String) {
            messageText = ((String) message).replaceAll("\n|\r|\t", "");
        } else if (message instanceof Document) {
            messageText = ((Document) message).asXML();
        } else {
            try {
                messageText = mapper.writeValueAsString(message);
            } catch (JsonProcessingException e) {
                messageText = "";
            }
        }
        
        String additionStr = annotation.addition();
        logger.info("{} {}", additionStr, messageText);
    }
}

至此,消息日志打印功能已经实现。

相关文章:

  • php命令行生成项目结构
  • P4035 [JSOI2008]球形空间产生器
  • 简述this指向
  • 如何理解angular自定义指令directive的scope属性?
  • zabbix3配置阿里云邮箱告警
  • 小葵花妈妈课堂开课了:《Runnable、Callable、Future、RunnableFuture、FutureTask 源码分析》...
  • 跟我学Shiro电子书
  • 嵌入式视觉应用的疆土在逐步扩大
  • requests 中文乱码
  • [原]Python安装和使用MySQLdb库(Windows系统)
  • c# IPC实现本机进程之间的通信
  • 网络编程--基础TCP
  • 使用jMeter构造大量并发HTTP请求进行微服务性能测试
  • DAY18-Django之分页和中间件
  • jmeter接口测试步骤
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • bootstrap创建登录注册页面
  • Consul Config 使用Git做版本控制的实现
  • Cookie 在前端中的实践
  • echarts花样作死的坑
  • ES学习笔记(12)--Symbol
  • Java的Interrupt与线程中断
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Meteor的表单提交:Form
  • mysql_config not found
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • PhantomJS 安装
  • Python中eval与exec的使用及区别
  • text-decoration与color属性
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • yii2权限控制rbac之rule详细讲解
  • 百度地图API标注+时间轴组件
  • 关于extract.autodesk.io的一些说明
  • 将 Measurements 和 Units 应用到物理学
  • 离散点最小(凸)包围边界查找
  • 聊聊sentinel的DegradeSlot
  • 码农张的Bug人生 - 初来乍到
  • 前端性能优化——回流与重绘
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 网页视频流m3u8/ts视频下载
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 自定义函数
  • 数据库巡检项
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​TypeScript都不会用,也敢说会前端?
  • !!Dom4j 学习笔记
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (剑指Offer)面试题41:和为s的连续正数序列