首页 > 其他分享 >日志工具类之“根据标记的注解进行指定的字段日志记录-在展示方式上会美观一些”

日志工具类之“根据标记的注解进行指定的字段日志记录-在展示方式上会美观一些”

时间:2024-06-05 14:46:34浏览次数:17  
标签:String price field import 注解 日志 美观

一、使用方法

在添加、编辑等操作功能时可以使用该方案,在需要记录日志的实体类字段中进行注解标注。并标明对应的字段名

二、代码

1.使用LoggerUtils工具类生成日志

  public JsonResult savePrice(Price price)
    {if (price.getId() != null)
        {
            String message = LoggerUtils.buildUpdateLog(priceMapper
                    .getPriceById(price.getId()), price, Price.class);
            priceMapper.updatePrice(price);
            portalLog.log(price.getId(), message);
        }
        else
        {
            priceMapper.createPrice(price);
            portalLog.log(price.getId(), LoggerUtils.buildInsertLog(price, Price.class));
        }
        return JsonResult.success("操作成功");
    }

 

2.在Price实体类中加入注解【@LogProperty("办公区域")】,并标识名字【办公区域】

@Data
public class Price implements Serializable
{
    /**
     * 主键
     */
    private Integer id;

    /**
     * 办公区域
     */
    @LogProperty("办公区域")
    private Integer officeAreaId;
}

 

3.日志工具类【LoggerUtils】

BusinessException 可以调整成别的抛出异常,或者可以直接抛出去到业务层处理
import org.apache.commons.lang3.StringUtils;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * 记录操作日志信息
 *
 * @author 王子威 2024年6月1日
 * @version V100R001
 * @since V100R001C001
 */
public class LoggerUtils
{
    /**
     * 新增
     */
    private final static String CREATE = "新增:";

    /**
     * 修改
     */
    private final static String UPDATE = "修改:";

    /**
     * 生成 对象更新 的变更日志信息
     *
     * @param dataToUpdate 待更新到数据库对象
     * @param dataDb       数据对象
     * @param targetClazz  目标类
     * @return 日志信息
     */
    public static String buildUpdateLog(Object dataToUpdate, Object dataDb, Class targetClazz)
    {
        if (null == dataToUpdate || null == dataDb || null == targetClazz)
        {
            return "";
        }
        StringBuilder logMsg = new StringBuilder();
        String details = StringUtils.EMPTY;

        try
        {
            // 要记录日志的 字段集合
            List<Field> targetList = new ArrayList<Field>();
            Field[] declaredFields = targetClazz.getDeclaredFields();
            for (Field field : declaredFields)
            {
                // 获取注解
                Annotation logPropertyAnnotation = field.getAnnotation(LogProperty.class);
                if (logPropertyAnnotation != null)
                {
                    // 放开权限
                    field.setAccessible(true);
                    // 获取注解标注的字段
                    targetList.add(field);
                }
            }
            if (targetList.size() <= 0)
            {
                // 没有要记录日志的字段
                return "";
            }
            // 目标对象日志拼接
            logMsg.append(UPDATE);
            for (Field field : targetList)
            {
                // 待更新 字段值
                Object valueToUpdate = field.get(dataToUpdate);
                // 数据库字段值
                Object valueFromDB = field.get(dataDb);
                LogProperty logProperty = field.getAnnotation(LogProperty.class);
                // 字段描述信息
                String fieldMsg = logProperty.value();
                if (null != valueToUpdate && !valueToUpdate.equals(valueFromDB))
                {
                    details = "【" + fieldMsg + "】由【" + valueFromDB + "】更改为【" + valueToUpdate + "】 ";
                    logMsg.append(details);
                }
            }
        }
        catch (IllegalAccessException e)
        {
            throw new BusinessException("日志生成异常", e);
        }
        return logMsg.toString();
    }

    /**
     * 生成 对象新增日志信息
     *
     * @param dataToInsert 待更新到数据库对象
     * @param targetClazz  目标类
     * @return 日志信息
     */
    public static String buildInsertLog(Object dataToInsert, Class targetClazz)
    {
        if (null == dataToInsert || null == targetClazz)
        {
            return "";
        }
        StringBuilder logMsg = new StringBuilder();
        String details = StringUtils.EMPTY;
        try
        {
            // 要记录日志的 字段集合
            List<Field> targetList = new ArrayList<Field>();
            Field[] declaredFields = targetClazz.getDeclaredFields();
            for (Field field : declaredFields)
            {
                Annotation logPropertyAnnotation = field.getAnnotation(LogProperty.class);
                if (logPropertyAnnotation != null)
                {
                    // 放开权限
                    field.setAccessible(true);
                    targetList.add(field);
                }
            }
            if (targetList.size() <= 0)
            {
                // 没有要记录日志的字段
                return "";
            }
            // 目标对象日志拼接
            logMsg.append(CREATE);
            for (Field field : targetList)
            {
                // 待更新 字段值
                Object valueToUpdate = field.get(dataToInsert);
                LogProperty logProperty = field.getAnnotation(LogProperty.class);
                // 字段描述信息
                String fieldMsg = logProperty.value();
                if (!Objects.isNull(valueToUpdate))
                {
                    details = "【" + fieldMsg + "-" + valueToUpdate + "】";
                }
                else
                {
                    details = "【" + fieldMsg + "-" + "null】";
                }
                logMsg.append(details);
            }
        }
        catch (IllegalAccessException e)
        {
            throw new BusinessException("日志生成异常", e);
        }
        return logMsg.toString();
    }
}

 

4.日志记录注解类【LogProperty】

import java.lang.annotation.*;

/**
 * 日志记录注解
 *
 * @author 王子威  2024年6月1日
 * @version V100R001
 * @since V100R001C001
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface LogProperty
{
    /**
     * 字段描述
     *
     * @return
     */
    String value() default "";
}

三、结果

修改操作

 添加操作

 

标签:String,price,field,import,注解,日志,美观
From: https://www.cnblogs.com/saoge/p/18233002

相关文章

  • java框架-日志-体系与级别-技巧
     体系一是提供了统一的日志门面API,即图中紫色部分,实现了中立的日志记录API。二是桥接功能,即图中蓝色部分,用来把各种日志框架的API(图中绿色部分)桥接到SLF4JAPI。这样一来,即便你的程序中使用了各种日志API记录日志,最终都可以桥接到SLF4J门面API。三是适配功能,即图......
  • Spring-MVC注解支持Ant风格的模糊匹配和Restful风格的接收数据------Spring-MVC框架
    packagecom.alatus.mvc3.controller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestMapping;@ControllerpublicclassIndexController{......
  • golang 使用 zap logger 加入Lumberjack 写日志
    golang使用zaplogger加入Lumberjack写日志Cd进入项目目录gogetgo.uber.org/zap/zapcoregoget-ugithub.com/natefinch/lumberjack关于下面代码说明: funcgetLogWriter()zapcore.WriteSyncer{lumberJackLogger:=&lumberjack.Logger{Filename:......
  • nlog日志
    添加配置文件设置属性:复制到输出目录,如果较新则复制<?xmlversion="1.0"encoding="utf-8"?><nlogxmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><targets&g......
  • MyBatis-Plus如何关闭SQL日志打印详解
    前言MyBatis-Plus配置关闭打印SQL日记失效追本溯源,关闭打印日记是真的失效吗?找到问题与解决问题 总结 前言前段时间公司的同事都过来问我,hua哥公司的项目出问题了,关闭不了打印sql日记,项目用宝塔自己部署的,磁盘满了才发现大量的打印sql日记,他们百度过都按照网上的配置......
  • java中的注解
    目录定义格式使用类型内置注解元注解自定义注解注解实现定义注解一般用于对程序的说明,想注释一样,但是区别是,注释是给人看的,注解是给程序看的让编译器进行编辑检查的作用,比如:@Override修饰的方法,如果改动了方法签名,将会编译报错格式注解是以@注解名在代码中存在,还可以添加一......
  • Tailwind CSS 无需书写 CSS!只需关注HTML,即可快速构建美观的网站
    https://www.tailwindcss.cn/一、TailwindCSS是干什么的?TailwindCSS是一个实用工具优先的CSS框架,它提供了一系列低级别的CSS类,这些类可以直接应用于HTML元素上。与传统的CSS框架(如Bootstrap、Foundation)不同,TailwindCSS不提供预定义的组件,而是通过组合这些......
  • Java中常见错误-Java中注解是否可以继承
    Java中注解是否可以继承@Inherited基本概念使用场景注意事项实体类自定义注解测试方法运行结果使用@Inherited不使用@Inherited结论在解决这个问题之前需要先了解一下@Inherited@Inherited基本概念​@Inherited是Java中的一个元注解,位于java.lang.annotatio......
  • webapi 中 使用log4net 日志记录到数据库中
    1.安装三个nuget包  2.创建 log4net.config文件,选中文件鼠标右键,选择属性->复制到输出目录修改为始终复制<?xmlversion="1.0"encoding="utf-8"?><log4net><!--Debug日志--><appendername="RollingFileDebug"type="log......
  • Spring Boot使用GraalVM编译为native excutable app的日志示例及主要步骤说明
    日志示例[INFO]---native-maven-plugin:0.9.28:compile(default-cli)@my-app---[INFO]FoundGraalVMinstallationfromGRAALVM_HOMEvariable.[INFO][graalvmreachabilitymetadatarepositoryforch.qos.logback:logback-classic:1.4.14]:Configurationdirector......