Java 系统中日志如何进行设置呢?

Posted 赵晓东-Nastu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 系统中日志如何进行设置呢?相关的知识,希望对你有一定的参考价值。

一、场景

我们可以想想系统中有可能数据是需要记录下来,然后展示或者存储,但是那么多种类的数据,我们又该如何去存储、如何展示呢?

二、解决方案

(1)设计数据库


通过操作类型就可以将不同的业务分割开来。

(2)实体类

package com.hc360.crm.entity.po;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * <p>
 * 操作记录日志表
 * </p>
 *
 * @author hc360
 * @since 2021-09-28
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class CrmOperationLog implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * id
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 资源id
     */
    private String resourceCode;

    /**
     * 分身id
     */
    private String clonedCode;

    /**
     * 操作记录内容
     */
    private String message;

    /**
     * 操作类型 0-写跟进 1-资源入库 2-资源流转 3-分配资源 4-领取资源 5-释放资源 6-认领资源 7-编辑 8-打电话 还有其它待定
     */
    private Integer operType;

    /**
     * 操作类型 value值 0-写跟进 1-资源入库 2-资源流转 3-分配资源 4-领取资源 5-释放资源 6-认领资源 7-编辑 8-打电话 还有其它待定
     */
    @TableField(exist = false)
    private String operTypeStr;

    /**
     * 操作类型为写跟进时有可能有图片 逗号分隔
     */
    private String imgUrls;

    /**
     * 操作人ssoid(创建人)
     */
    private Integer createSsoid;

    /**
     * 操作人username(创建人)
     */
    private String createUsername;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
}

(3)枚举

package com.hc360.crm.common.enums;

import lombok.Getter;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * 操作日志记录枚举
 */
@Getter
public enum OperationEnum {
    WIRTE_FOLLOW(0, "写跟进", ""),
    //「AAAAA有限公司」资源由「慧优采活动页面」入库
    RESOURCE_STORAGE(1, "资源入库", "「%s」资源由「%s」入库"),
    //「AAAAA有限公司」资源由系统自动分配给电销体系
    RESOURCE_TRANSFER(2, "资源流转", "「%s」资源由「%s」自动分配给「%s」"),
    //「山涛」由「客户资源池」-「客户池」中将该客户分配给「桓温」
    ALLOT_RESOURCE(3, "分配资源", "「%s」由「%s」-「%s」中将该客户分配给「%s」"),
    //「桓温」接收「山涛」由「客户资源池」-「客户池」中分配的客户
    RECEIVE_RESOURCE(4, "领取资源", "「%s」接收「%s」由「%s」-「%s」中分配的客户"),
    // 从「客户资源池」-「我的客户」中释放该客户
    RELEASE_RESOURCE(5, "释放资源", "从「%s」-「%s」中释放该客户"),
    // 从「客户资源池」-「客户池」中领取该客户
    CLAIM_RESOURCE(6, "认领资源", "从「%s」-「%s」中领取该客户"),
    // 行业:从「互联网」变更为「农林牧副渔」
    // 联系人:从「空」变更为「嵇康」
    EDIT_RESOURCE(7, "编辑", "%s: 从[%s]变更为[%s]"),
    // 坐席8001主动拨打18600000000
    CALL_UP(8, "打电话", "坐席%s主动拨打%s"),
    // 写计划
    WIRTE_PLAN(9, "写计划", ""),
    // 删除计划
    DELETE_PLAN(10, "删除计划", ""),
    // 完成计划
    FINISHED_PLAN(11, "完成计划", ""),
    // 编辑计划
    EDIT_PLAN(12,"编辑计划","计划内容从「%s」变更为 「%s」");
    private final int code;
    private final String value;
    private final String msg;

    OperationEnum(int code, String value, String msg) {
        this.code = code;
        this.value = value;
        this.msg = msg;
    }

    private static final Map<Integer, OperationEnum> CACHE = new HashMap<>();

    static {
        Arrays.stream(OperationEnum.values()).forEach(item -> CACHE.put(item.getCode(), item));
    }

    public static OperationEnum getEnum(int code) {
        return CACHE.getOrDefault(code, null);
    }
}

(4) 插入到库中

        //插入日志
        CrmOperationLog crmOperationEdit = CrmOperationLog.builder()
                .resourceCode(resourceCode)
                .clonedCode(emtCode)
                .operType(OperationEnum.EDIT_PLAN.getCode())
                .message(String.format(OperationEnum.EDIT_PLAN.getMsg(), planContextBefore, planContextAfter))
                .imgUrls("")
                .createSsoid(ssoId)
                .createUsername(name)
                .createTime(LocalDateTime.now())
                .build();
        //插入到表中
        asyncService.saveOperationLog(crmOperationEdit);

这里面注意有一个String.format 可以做变量的替换,
String.format了解

(5)查询

    @Override
    public List<CrmOperationLog> getClonedResourceOperationLog(String clonedCode, Integer operType) {
        // 获取分身的操作日志,先不做分页处理
        List<CrmOperationLog> list = crmOperationLogMapper.getClonedResourceOperationLog(clonedCode, operType);
        if (list.size()>0){
            // 还原operType字典值
            for (CrmOperationLog operationLog : list) {
                operationLog.setOperTypeStr(OperationEnum.getEnum(operationLog.getOperType()).getValue());
            }
        }
        return list;
    }

查询的话,可以直接用枚举进行转换

三、总结

其实爬虫等一些也可以这样,在数据库中设置通用字段,然后通过枚举进行区分。

以上是关于Java 系统中日志如何进行设置呢?的主要内容,如果未能解决你的问题,请参考以下文章

常用python日期日志获取内容循环的代码片段

如何查看log日志文件呢?

如何利用redis来进行分布式集群系统的限流设计

VSCode插件开发全攻略代码片段设置自定义欢迎页

如何进行 Java 代码阅读分析?

webstorm代码片段的创建