实现日志功能的思路

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 实现日志功能的思路

需求


客户希望实现下面的详情操作日志功能


5d4c6812c8535adbb050f4ddf2e1bce8.png


思路


这样 只要修改数据库的地方,比如增,删,改的地方就要保存日志记录,增加和删除好做,麻烦的就是修改,怎么弄呢,整理了下:


参考链接


参考链接:

https://blog.csdn.net/liu_ling1216/article/details/80207985

//获取属性上的注解

https://blog.csdn.net/shidebin/article/details/86593949


步骤1


前提,根据id 获取 旧的对象, 传参获取新对象


步骤2


获取2个对象 同一个属性,不同的值,


  将 属性名,新值 ,旧值 放入一个 list集合中

by the way 中文名: 根据注解获取
    list = [
        {
          'name':,
           'old':'',
           'new':'',
           comment:''
         }
    ]
    list中的每个对象,最好建一张表


保存到 日志表中去


测试代码


测试实体 student.java

package com.platform.utils;
import com.platform.annotation.Comment;
public class Student {
    @Comment(value = "编号")
    private Integer id;
    @Comment(value = "姓名")
    private String username;
    @Comment(value = "年龄")
    private Integer age;
    public Student() {
    }
    public Student(Integer id, String username) {
        this.id = id;
        this.username = username;
    }
    public Student(Integer id, String username, Integer age) {
        this.id = id;
        this.username = username;
        this.age = age;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
       return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}


自定义注解


/**
 * 注解实体
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Comment {
    String value() default "";
}


工具类 LogUtil.java

package com.platform.utils;
  import com.platform.annotation.Comment;
  import java.lang.reflect.Field;
  import java.util.*;
  public class LogUtil {
     /**
      * 获取两个对象同名属性内容不相同的列表
      */
     public static List<Map<String, Object>> compareTwoClass(Object class1, Object class2) throws ClassNotFoundException, IllegalAccessException {
         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
         //获取对象的class
         Class<?> clazz1 = class1.getClass();
         Class<?> clazz2 = class2.getClass();
         //获取对象的属性列表
         Field[] field1 = clazz1.getDeclaredFields();
         Field[] field2 = clazz2.getDeclaredFields();
         //遍历属性列表field1
         for (int i = 0; i < field1.length; i++) {
             //遍历属性列表field2
             for (int j = 0; j < field2.length; j++) {
                 //如果field1[i]属性名与field2[j]属性名内容相同
                 if (field1[i].getName().equals(field2[j].getName())) {
                     field1[i].setAccessible(true);
                     field2[j].setAccessible(true);
                     //如果field1[i]属性值与field2[j]属性值内容不相同
                     if (!compareTwo(field1[i].get(class1), field2[j].get(class2))) {
                         Map<String, Object> map2 = new HashMap<String, Object>();
                         Comment comment = field1[i].getDeclaredAnnotation(Comment.class);
                         if(comment!=null){
                             map2.put("name", comment.value()); //注解名字
                             map2.put("old", field1[i].get(class1));
                             map2.put("new", field2[j].get(class2));
                             list.add(map2);
                         }
                     }
                     break;
                 }
             }
         }
         return list;
     }
     //对比两个数据是否内容相同
     public static boolean compareTwo(Object object1, Object object2) {
         if (object1 == null && object2 == null) {
             return true;
         }
         //以下注掉代码,看具体需求。因有时会出现源数据是没有进行赋值,因此是null;而通过EditText获取值的时候,虽然没有值,但是会变成"",但是本质是没有赋值的。
         //if (object1 == "" && object2 == null) {
         //    return true;
         //}
         //if (object1 == null && object2 == "") {
         //    return true;
         // }
         if (object1 == null && object2 != null) {
             return false;
         }
         if (object1.equals(object2)) {
             return true;
         }
         return false;
     }
     public static void main(String[] args) throws IllegalAccessException, ClassNotFoundException {
         Student s1 = new Student(1, "张三", 29);
         Student s2 = new Student(2, "李四",29);
         List<Map<String, Object>>  maps = compareTwoClass(s1, s2);
         for (Map<String, Object> m : maps){
             System.out.println(m.get("name")+"===="+m.get("old")+"===="+m.get("new"));
         }
     }
  }


测试结果:

1dc618a0ed9580ce8bfa6facb208c08f.png

自此 测试完毕,下面就是 无脑码代码了!

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
8月前
|
存储 Go
Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能
本文将探讨几个热门的 go 日志库如 logrus、zap 和官网的 slog,我将分析这些库的的关键设计元素,探讨它们是如何支持日志轮转与切割功能的配置。
309 0
Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能
C++-实现日志log功能
C++-实现日志log功能
160 0
|
3月前
|
Rust 前端开发 JavaScript
Tauri 开发实践 — Tauri 日志记录功能开发
本文介绍了如何为 Tauri 应用配置日志记录。Tauri 是一个利用 Web 技术构建桌面应用的框架。文章详细说明了如何在 Rust 和 JavaScript 代码中设置和集成日志记录,并控制日志输出。通过添加 `log` crate 和 Tauri 日志插件,可以轻松实现多平台日志记录,包括控制台输出、Webview 控制台和日志文件。文章还展示了如何调整日志级别以优化输出内容。配置完成后,日志记录功能将显著提升开发体验和程序稳定性。
174 1
Tauri 开发实践 — Tauri 日志记录功能开发
|
1月前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
|
8月前
|
数据采集 分布式计算 监控
日志服务功能特性
日志服务功能特性
74 7
|
4月前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
211 9
|
5月前
|
存储 监控 Serverless
函数计算发布功能问题之用户在使用主流函数计算产品的日志服务时可能会遇到使用成本的问题如何解决
函数计算发布功能问题之用户在使用主流函数计算产品的日志服务时可能会遇到使用成本的问题如何解决
|
5月前
|
监控 Serverless 开发者
函数计算发布功能问题之查看函数的调用日志的问题如何解决
函数计算发布功能问题之查看函数的调用日志的问题如何解决
|
6月前
|
Python
Python编程实战:利用闭包与装饰器优化日志记录功能
【7月更文挑战第7天】Python的闭包和装饰器简化了日志记录。通过定义如`log_decorator`的装饰器,可以在不修改原函数代码的情况下添加日志功能。当@log_decorator用于`add(x, y)`函数时,调用时自动记录日志。进一步,`timestamp_log_decorator`展示了如何创建特定功能的装饰器,如添加时间戳。这些技术减少了代码冗余,提高了代码的可维护性。
81 1
|
6月前
|
监控
若依修改-----其他功能,包括参数设置,通知公告,日志管理,验证码控制开关在参数设置里,若依的注册页面是隐藏的,在src的login.vue的97行注册开发,修改成true,通知公告,促进组织内部信
若依修改-----其他功能,包括参数设置,通知公告,日志管理,验证码控制开关在参数设置里,若依的注册页面是隐藏的,在src的login.vue的97行注册开发,修改成true,通知公告,促进组织内部信