Jelajahi Sumber

操作日志

李进 2 tahun lalu
induk
melakukan
6ba328662c

+ 5 - 1
sys-api-service/pom.xml

@@ -76,7 +76,11 @@
             <artifactId>xy-excel</artifactId>
             <version>1.0</version>
         </dependency>
-
+        <dependency>
+            <groupId>com.xy</groupId>
+            <artifactId>xy-es</artifactId>
+            <version>1.0</version>
+        </dependency>
 
     </dependencies>
 </project>

+ 29 - 0
sys-api-service/src/main/java/com/xy/config/SysThreadPoolConfig.java

@@ -0,0 +1,29 @@
+package com.xy.config;
+
+import com.dtp.core.support.DynamicTp;
+import com.xy.utils.ThreadPoolUtils;
+import org.springframework.context.annotation.Bean;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SysThreadPoolConfig {
+
+    public static final String LOG_POLL = "logPoll";
+
+    /**
+     * 日志线程池
+     */
+    @DynamicTp
+    @Bean(LOG_POLL)
+    public ThreadPoolTaskExecutor logPoll() {
+        int coreSize = 10;
+        return ThreadPoolUtils.newPoll()
+                .name(LOG_POLL)
+                .coreSize(coreSize)
+                .maxSize(coreSize * 2)
+                .keepAlive(60)
+                .queueSize(coreSize * 10)
+                .builder();
+    }
+}

+ 48 - 0
sys-api-service/src/main/java/com/xy/consumer/LogConsumer.java

@@ -0,0 +1,48 @@
+package com.xy.consumer;
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.xy.config.SysThreadPoolConfig;
+import com.xy.entity.LogOperate;
+import com.xy.entity.LogSysEnvents;
+import com.xy.entity.LogTasks;
+import com.xy.mapper.LogOperateMapper;
+import com.xy.mapper.LogSysEnventsMapper;
+import com.xy.mapper.LogTasksMapper;
+import com.xy.utils.LambdaUtils;
+import com.xy.utils.ThreadPoolUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * 日志消费者
+ */
+@Service
+@RequiredArgsConstructor
+public class LogConsumer implements MqttConsumer {
+
+    private final LogOperateMapper logOperateMapper;
+
+    private final LogSysEnventsMapper logSysEnventsMapper;
+
+    private final LogTasksMapper logTasksMapper;
+
+    @Override
+    public boolean message(String topic, String payload) {
+        ThreadPoolUtils.excPoll(SysThreadPoolConfig.LOG_POLL, 1)
+                .execute(() -> {
+                    JSONObject jsonObject = JSONUtil.parseObj(payload);
+                    String type = jsonObject.getStr(LambdaUtils.getProperty(LogOperate::getType));
+                    if ("operate".equals(type)) {
+                        logOperateMapper.insert(jsonObject.toBean(LogOperate.class));
+                    }
+                    if ("envents".equals(type)) {
+                        logSysEnventsMapper.insert(jsonObject.toBean(LogSysEnvents.class));
+                    }
+                    if ("tasks".equals(type)) {
+                        logTasksMapper.insert(jsonObject.toBean(LogTasks.class));
+                    }
+                });
+        return true;
+    }
+}

+ 55 - 0
sys-api-service/src/main/java/com/xy/consumer/LogConsumerConfiguration.java

@@ -0,0 +1,55 @@
+package com.xy.consumer;
+
+import com.xy.configuration.MqttConfigUtils;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.integration.annotation.IntegrationComponentScan;
+import org.springframework.integration.annotation.ServiceActivator;
+import org.springframework.integration.channel.DirectChannel;
+import org.springframework.integration.core.MessageProducer;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.messaging.MessageHandler;
+
+@Configuration
+@IntegrationComponentScan
+public class LogConsumerConfiguration {
+
+    /**
+     * topic
+     */
+    public final static String TOPIC = "log";
+
+    /**
+     * 入站通道名(消费者)订阅的bean名称
+     */
+    public static final String CHANNEL_NAME_IN = TOPIC + "MqttInboundChannel";
+
+
+    /*******************************消费者*******************************************/
+
+    /**
+     * MQTT信息通道(消费者)
+     */
+    @Bean(name = CHANNEL_NAME_IN)
+    public MessageChannel mqttInboundChannel() {
+        return new DirectChannel();
+    }
+
+    /**
+     * MQTT消息订阅绑定(消费者)
+     */
+    @Bean(name = TOPIC + "Inbound")
+    public MessageProducer inbound() {
+        return MqttConfigUtils.inbound(TOPIC, mqttInboundChannel());
+    }
+
+    /**
+     * MQTT消息处理器(消费者)
+     */
+    @Bean(name = TOPIC + "Handler")
+    @ServiceActivator(inputChannel = CHANNEL_NAME_IN)
+    public MessageHandler handler() {
+        return MqttConfigUtils.handler();
+    }
+
+}

+ 73 - 0
sys-api-service/src/main/java/com/xy/entity/LogOperate.java

@@ -0,0 +1,73 @@
+package com.xy.entity;
+
+import cn.easyes.annotation.IndexId;
+import cn.easyes.annotation.IndexName;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 操作日志
+ */
+@Data
+@Accessors(chain = true)
+@IndexName("log_operate")
+public class LogOperate {
+
+    @IndexId
+    private String id;
+
+    /**
+     * 日志类型 1=登录日志 2=操作日志
+     */
+    private Integer logType;
+
+    /**
+     * 日志内容
+     */
+    private String logContent;
+
+    /**
+     * 客户端类型
+     */
+    private String clientType;
+
+    /**
+     * 系统ID
+     */
+    private Long sysId;
+
+    /**
+     * 客户端ip
+     */
+    private String clientIp;
+
+    /**
+     * 操作人
+     */
+    private Long optUserId;
+
+    /**
+     * 操作类型 1=新增 2=修改 3=查询 4=删除 5=导出 6=导入
+     */
+    private Integer optType;
+
+    /**
+     * 操作耗时
+     */
+    private Integer optTime;
+
+    /**
+     * 创建时间
+     */
+    private String createTime;
+
+    /**
+     * 服务名
+     */
+    private String serviceName;
+
+    /**
+     * 日志类别
+     */
+    private String type;
+}

+ 53 - 0
sys-api-service/src/main/java/com/xy/entity/LogSysEnvents.java

@@ -0,0 +1,53 @@
+package com.xy.entity;
+
+import cn.easyes.annotation.IndexId;
+import cn.easyes.annotation.IndexName;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 事件日志
+ */
+@Data
+@Accessors(chain = true)
+@IndexName("log_tasks")
+public class LogSysEnvents {
+
+    @IndexId
+    private String id;
+
+    /**
+     * 事件名称
+     */
+    private String eventName;
+
+    /**
+     * 事件等级
+     */
+    private Integer eventLevel;
+
+    /**
+     * 事件描述
+     */
+    private String eventDescript;
+
+    /**
+     * 服务器IP
+     */
+    private String serverIp;
+
+    /**
+     * 服务名
+     */
+    private String serviceName;
+
+    /**
+     * 创建时间
+     */
+    private String createTime;
+
+    /**
+     * 日志类别
+     */
+    private String type;
+}

+ 58 - 0
sys-api-service/src/main/java/com/xy/entity/LogTasks.java

@@ -0,0 +1,58 @@
+package com.xy.entity;
+
+import cn.easyes.annotation.IndexId;
+import cn.easyes.annotation.IndexName;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 定时任务日志
+ */
+@Data
+@Accessors(chain = true)
+@IndexName("log_sys_envents")
+public class LogTasks {
+
+    @IndexId
+    private String id;
+
+    /**
+     * 定时任务类型,中文
+     */
+    private String taskType;
+
+    /**
+     * 任务标题
+     */
+    private String taskTitle;
+
+    /**
+     * 任务事件,中文
+     */
+    private String taskEvent;
+
+    /**
+     * 事件描述
+     */
+    private String taskDescript;
+
+    /**
+     * 服务器IP
+     */
+    private String serverIp;
+
+    /**
+     * 服务名
+     */
+    private String serviceName;
+
+    /**
+     * 创建时间
+     */
+    private String createTime;
+
+    /**
+     * 日志类别
+     */
+    private String type;
+}

+ 7 - 0
sys-api-service/src/main/java/com/xy/mapper/LogOperateMapper.java

@@ -0,0 +1,7 @@
+package com.xy.mapper;
+
+import cn.easyes.core.conditions.interfaces.BaseEsMapper;
+import com.xy.entity.LogOperate;
+
+public interface LogOperateMapper extends BaseEsMapper<LogOperate> {
+}

+ 7 - 0
sys-api-service/src/main/java/com/xy/mapper/LogSysEnventsMapper.java

@@ -0,0 +1,7 @@
+package com.xy.mapper;
+
+import cn.easyes.core.conditions.interfaces.BaseEsMapper;
+import com.xy.entity.LogSysEnvents;
+
+public interface LogSysEnventsMapper extends BaseEsMapper<LogSysEnvents> {
+}

+ 7 - 0
sys-api-service/src/main/java/com/xy/mapper/LogTasksMapper.java

@@ -0,0 +1,7 @@
+package com.xy.mapper;
+
+import cn.easyes.core.conditions.interfaces.BaseEsMapper;
+import com.xy.entity.LogTasks;
+
+public interface LogTasksMapper extends BaseEsMapper<LogTasks> {
+}

+ 10 - 0
sys-sdk/pom.xml

@@ -28,5 +28,15 @@
             <artifactId>xy-redis</artifactId>
             <version>1.0</version>
         </dependency>
+        <dependency>
+            <groupId>com.xy</groupId>
+            <artifactId>xy-mqtt</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.xy</groupId>
+            <artifactId>authorize-sdk</artifactId>
+            <version>1.0</version>
+        </dependency>
     </dependencies>
 </project>

+ 37 - 0
sys-sdk/src/main/java/com/xy/annotation/LogOperate.java

@@ -0,0 +1,37 @@
+package com.xy.annotation;
+
+import com.xy.enums.LogEnum;
+
+import java.lang.annotation.*;
+
+/**
+ * 操作日志
+ *
+ * @author lijin
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface LogOperate {
+
+    /**
+     * 日志类型
+     *
+     * @return
+     */
+    LogEnum.LogType logType() default LogEnum.LogType.V2;
+
+    /**
+     * 操作类型
+     *
+     * @return
+     */
+    LogEnum.OptType optType() default LogEnum.OptType.V100;
+
+    /**
+     * 日志内容
+     *
+     * @return
+     */
+    String logContent() default "";
+}

+ 130 - 0
sys-sdk/src/main/java/com/xy/annotation/aspet/LogAspet.java

@@ -0,0 +1,130 @@
+package com.xy.annotation.aspet;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.TimeInterval;
+import com.xy.annotation.LogOperate;
+import com.xy.collections.list.JArrayList;
+import com.xy.collections.list.JList;
+import com.xy.enums.LogEnum;
+import com.xy.utils.Emptys;
+import com.xy.utils.LogUtils;
+import com.xy.utils.R;
+import com.xy.utils.Tuple;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+@Aspect
+@Component
+@RequiredArgsConstructor
+public class LogAspet {
+
+    JList<String> adds = new JArrayList<>(Arrays.asList("新增", "添加", "保存", "创建"));
+
+    JList<String> dels = new JArrayList<>(Arrays.asList("删除", "清除", "清空"));
+
+    JList<String> updates = new JArrayList<>(Arrays.asList("修改", "重置"));
+
+    JList<String> querys = new JArrayList<>(Arrays.asList("查询"));
+
+    JList<String> exports = new JArrayList<>(Arrays.asList("导出", "下载"));
+
+    JList<String> leads = new JArrayList<>(Arrays.asList("导入", "上传"));
+
+    /**
+     * 操作日志
+     *
+     * @param joinPoint
+     * @param logOperate
+     * @return
+     * @throws Throwable
+     */
+    @Around("@annotation(logOperate)")
+    public Object LogOperate(ProceedingJoinPoint joinPoint, LogOperate logOperate) throws Throwable {
+        TimeInterval timeInterval = DateUtil.timer();
+        LogEnum.LogType logType = logOperate.logType();
+        LogEnum.OptType optType = logOperate.optType();
+        String logContent = logOperate.logContent();
+        //处理默认参数
+        if (optType.getValue() == LogEnum.OptType.V100.getValue()) {
+            Tuple.Tuple2<String, LogEnum.OptType> apiOperation = getApiOperation(joinPoint, optType);
+            optType = apiOperation.getV2();
+        }
+        if (!Emptys.check(logContent)) {
+            String api = getApi(joinPoint);
+            Tuple.Tuple2<String, LogEnum.OptType> apiOperation = getApiOperation(joinPoint, optType);
+            logContent = api + "-" + apiOperation.getV1();
+        }
+        //参数
+        Object[] args = joinPoint.getArgs();
+        Object result = null;
+        try {
+            result = joinPoint.proceed(args);
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            if (optType.getValue() != LogEnum.OptType.V100.getValue() && Emptys.check(logContent)) {
+                if (result != null && result instanceof R) {
+                    R r = (R) result;
+                    String logMsg = r.getLogMsg();
+                    if (Emptys.check(logMsg)) {
+                        logContent += "-" + logMsg;
+                    }
+                }
+                LogUtils.operate(logType, optType, logContent, (int) timeInterval.interval());
+            }
+        }
+        return result;
+    }
+
+    private String getApi(ProceedingJoinPoint joinPoint) {
+        Class<?> classz = joinPoint.getTarget().getClass();
+        Api api = classz.getAnnotation(Api.class);
+        if (api != null) {
+            String[] tags = api.tags();
+            return tags[0];
+        }
+        return "";
+    }
+
+    private Tuple.Tuple2<String, LogEnum.OptType> getApiOperation(ProceedingJoinPoint joinPoint, LogEnum.OptType optType) {
+        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
+        ApiOperation apiOperation = method.getAnnotation(ApiOperation.class);
+        if (apiOperation != null) {
+            String value = apiOperation.value();
+            optType = getOptType(value);
+            return new Tuple.Tuple2<>(value, optType);
+        }
+        return new Tuple.Tuple2<>("", optType);
+    }
+
+    private LogEnum.OptType getOptType(String value) {
+        if (adds.filter().vlike(value).object() != null) {
+            return LogEnum.OptType.V1;
+        }
+        if (dels.filter().vlike(value).object() != null) {
+            return LogEnum.OptType.V4;
+        }
+        if (updates.filter().vlike(value).object() != null) {
+            return LogEnum.OptType.V2;
+        }
+        if (querys.filter().vlike(value).object() != null) {
+            return LogEnum.OptType.V3;
+        }
+        if (exports.filter().vlike(value).object() != null) {
+            return LogEnum.OptType.V5;
+        }
+        if (leads.filter().vlike(value).object() != null) {
+            return LogEnum.OptType.V6;
+        }
+        return LogEnum.OptType.V100;
+    }
+}

+ 57 - 0
sys-sdk/src/main/java/com/xy/enums/LogEnum.java

@@ -0,0 +1,57 @@
+package com.xy.enums;
+
+import lombok.Getter;
+
+public class LogEnum {
+
+    @Getter
+    public enum LogType {
+        V1(1, "登录日志"),
+        V2(2, "操作日志");
+
+
+        LogType(int value, String msg) {
+            this.value = value;
+            this.msg = msg;
+        }
+
+        private int value;
+
+        private String msg;
+    }
+
+    @Getter
+    public enum OptType {
+        V1(1, "新增"),
+        V2(2, "修改"),
+        V3(3, "查询"),
+        V4(4, "删除"),
+        V5(5, "导出"),
+        V6(6, "导入"),
+        V100(100, "自动识别");
+
+        OptType(int value, String msg) {
+            this.value = value;
+            this.msg = msg;
+        }
+
+        private int value;
+
+        private String msg;
+    }
+
+    @Getter
+    public enum EventLevel {
+        V1(1, "未定义等级"),
+        ;
+
+        EventLevel(int value, String msg) {
+            this.value = value;
+            this.msg = msg;
+        }
+
+        private int value;
+
+        private String msg;
+    }
+}

+ 26 - 0
sys-sdk/src/main/java/com/xy/producer/LogProducer.java

@@ -0,0 +1,26 @@
+package com.xy.producer;
+
+import org.springframework.integration.annotation.MessagingGateway;
+import org.springframework.integration.mqtt.support.MqttHeaders;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+/**
+ * 生产者接口
+ */
+@Component
+@MessagingGateway(defaultRequestChannel = LogProducerConfiguration.CHANNEL_NAME_OUT)
+public interface LogProducer {
+
+    /**
+     * ata是发送消息的内容
+     * topic是消息发送的主题,就是配置文件的主题
+     * qos是mqtt 对消息处理机制分为0,1,2 其中0表示的是订阅者没收到消息不会再次发送,消息会丢失,1表示的是会尝试重试,一直到接收到消息,但这种情况可能导致订阅者收到多次重复消息,2相比多了一次去重的动作,确保订阅者收到的消息有一次
+     */
+
+    void sendToMqtt(String data);
+
+    void sendToMqtt(String data, @Header(MqttHeaders.TOPIC) String topic);
+
+    void sendToMqtt(String data, @Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos);
+}

+ 46 - 0
sys-sdk/src/main/java/com/xy/producer/LogProducerConfiguration.java

@@ -0,0 +1,46 @@
+package com.xy.producer;
+
+import com.xy.configuration.MqttConfigUtils;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.integration.annotation.IntegrationComponentScan;
+import org.springframework.integration.annotation.ServiceActivator;
+import org.springframework.integration.channel.DirectChannel;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.messaging.MessageHandler;
+
+@Configuration
+@IntegrationComponentScan
+public class LogProducerConfiguration {
+
+    /**
+     * topic
+     */
+    public final static String TOPIC = "log";
+
+    /**
+     * 出站通道名(生产者)发布的bean名称
+     */
+    public static final String CHANNEL_NAME_OUT = TOPIC + "MqttOutboundChannel";
+
+
+    /*******************************生产者*******************************************/
+
+    /**
+     * MQTT信息通道(生产者)
+     */
+    @Bean(name = CHANNEL_NAME_OUT)
+    public MessageChannel mqttOutboundChannel() {
+        return new DirectChannel();
+    }
+
+    /**
+     * MQTT消息处理器(生产者)
+     */
+    @Bean(name = TOPIC + "MqttOutbound")
+    @ServiceActivator(inputChannel = CHANNEL_NAME_OUT)
+    public MessageHandler mqttOutbound() {
+        return MqttConfigUtils.mqttOutbound(TOPIC);
+    }
+
+}

+ 138 - 0
sys-sdk/src/main/java/com/xy/utils/LogUtils.java

@@ -0,0 +1,138 @@
+package com.xy.utils;
+
+import cn.hutool.json.JSONObject;
+import com.xy.config.SpringConfigs;
+import com.xy.enums.LogEnum;
+import com.xy.producer.LogProducer;
+import com.xy.producer.LogProducerConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+
+@Component
+public class LogUtils {
+
+    private static SpringConfigs springConfigs;
+
+    private static LogProducer logProducer;
+
+    @Autowired(required = false)
+    public void setSpringConfigs(SpringConfigs springConfigs) {
+        LogUtils.springConfigs = springConfigs;
+    }
+
+    @Autowired(required = false)
+    public void setMqttProducer(LogProducer logProducer) {
+        LogUtils.logProducer = logProducer;
+    }
+
+    /**
+     * 操作日志
+     *
+     * @param logType    日志类型
+     * @param optType    操作类型
+     * @param logContent 日志内容
+     * @param optTime    操作耗时
+     */
+    public static void operate(LogEnum.LogType logType, LogEnum.OptType optType, String logContent, int optTime) {
+        JSONObject jsonObject = new JSONObject()
+                .set("logType", logType.getValue())
+                .set("logContent", logContent)
+                .set("optType", optType.getValue())
+                .set("createTime", DataTime.getSring())
+                .set("optTime", optTime)
+                .set("clientType", AuthorizeUtils.getClientType())
+                .set("sysId", AuthorizeUtils.getSysId())
+                .set("optUserId", AuthorizeUtils.getLoginId(Long.class))
+                .set("clientIp", getIp())
+                .set("serviceName", springConfigs.getApplication().getName())
+                .set("type", "operate");
+        logProducer.sendToMqtt(jsonObject.toString(), LogProducerConfiguration.TOPIC, 0);
+    }
+
+    /**
+     * 系统事件
+     *
+     * @param eventName     事件名称
+     * @param eventLevel    事件等级
+     * @param eventDescript 事件描述
+     */
+    public static void envents(String eventName, LogEnum.EventLevel eventLevel, String eventDescript) {
+        JSONObject jsonObject = new JSONObject()
+                .set("eventName", eventName)
+                .set("eventLevel", eventLevel.getValue())
+                .set("eventDescript", eventDescript)
+                .set("serviceName", springConfigs.getApplication().getName())
+                .set("createTime", DataTime.getSring())
+                .set("type", "envents");
+        logProducer.sendToMqtt(jsonObject.toString(), LogProducerConfiguration.TOPIC, 0);
+    }
+
+    /**
+     * 定时任务日志
+     *
+     * @param taskType     定时任务类型,中文
+     * @param taskTitle    任务标题
+     * @param taskEvent    任务事件,中文
+     * @param taskDescript 事件描述
+     */
+    public static void tasks(String taskType, String taskTitle, String taskEvent, String taskDescript) {
+        JSONObject jsonObject = new JSONObject()
+                .set("taskType", taskType)
+                .set("taskTitle", taskTitle)
+                .set("taskEvent", taskEvent)
+                .set("taskDescript", taskDescript)
+                .set("serviceName", springConfigs.getApplication().getName())
+                .set("createTime", DataTime.getSring())
+                .set("type", "tasks");
+        logProducer.sendToMqtt(jsonObject.toString(), LogProducerConfiguration.TOPIC, 0);
+    }
+
+    /**
+     * 获取ip
+     *
+     * @return
+     */
+    private static String getIp() {
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+        String ipAddress;
+        try {
+            ipAddress = request.getHeader("x-forwarded-for");
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getHeader("Proxy-Client-IP");
+            }
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getHeader("WL-Proxy-Client-IP");
+            }
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getRemoteAddr();
+                if (ipAddress.equals("127.0.0.1")) {
+                    // 根据网卡取本机配置的IP
+                    InetAddress inet = null;
+                    try {
+                        inet = InetAddress.getLocalHost();
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    ipAddress = inet.getHostAddress();
+                }
+            }
+            // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
+            if (ipAddress != null && ipAddress.length() > 15) {
+                // "***.***.***.***".length()
+                // = 15
+                if (ipAddress.indexOf(",") > 0) {
+                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
+                }
+            }
+        } catch (Exception e) {
+            ipAddress = "";
+        }
+        return ipAddress;
+    }
+
+}

+ 11 - 0
sys-start/pom.xml

@@ -46,6 +46,17 @@
             <version>1.0</version>
         </dependency>
 
+        <!-- es -->
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-high-level-client</artifactId>
+            <version>7.14.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.elasticsearch</groupId>
+            <artifactId>elasticsearch</artifactId>
+            <version>7.14.0</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 1 - 0
sys-start/src/main/resources/bootstrap-prod.yml

@@ -2,6 +2,7 @@ spring:
   mqtt:
     topics:
       - { topic: "msgNotify", handler: com.xy.consumer.MsgConsumer }
+      - { topic: "log", handler: com.xy.consumer.LogConsumer }
 
 #微服务相关配置
 cloud:

+ 1 - 0
sys-start/src/main/resources/bootstrap-uat.yml

@@ -2,6 +2,7 @@ spring:
   mqtt:
     topics:
       - { topic: "msgNotify", handler: com.xy.consumer.MsgConsumer }
+      - { topic: "log", handler: com.xy.consumer.LogConsumer }
 
 #微服务相关配置
 cloud:

+ 1 - 1
sys-start/src/main/resources/bootstrap.yml

@@ -10,7 +10,7 @@ cloud:
   center:
     url: 119.96.213.127:9007
     config:
-      shared-configs: redis.yaml,mysql.yaml,mqtt.yaml,xy-oss.yaml,xxl-job.yaml
+      shared-configs: redis.yaml,mysql.yaml,mqtt.yaml,xy-oss.yaml,xxl-job.yaml,es.yaml
       name: sys
   service:
     name: dev-sys

+ 0 - 3
sys-start/src/main/resources/doc/20230323.md

@@ -1,3 +0,0 @@
-## 2023-03-23
-1. 对象存储上传指定目录
-2. oss上传接口文档