Bladeren bron

add 系统运行日志
del 删除冗余代码

A17404李放 3 jaren geleden
bovenliggende
commit
e003746ac4

+ 10 - 4
nb-admin/src/main/resources/logback-spring.xml

@@ -5,6 +5,13 @@
               value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
     <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>
 
+
+    <appender name="WARNLOGEventPublisher" class="com.nb.framework.logback.SystemLoggingAppender">
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>ERROR</level>
+        </filter>
+    </appender>
+
     <!-- 控制台输出 -->
     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
         <encoder>
@@ -82,14 +89,13 @@
     <!-- Spring日志级别控制  -->
     <logger name="org.springframework" level="warn"/>
 
-    <root level="info">
-        <appender-ref ref="console"/>
-    </root>
-
     <!--系统操作日志-->
     <root level="info">
+        <appender-ref ref="WARNLOGEventPublisher"/>
         <appender-ref ref="sys_info"/>
         <appender-ref ref="sys_error"/>
         <appender-ref ref="sys_console"/>
+        <appender-ref ref="console"/>
     </root>
+
 </configuration> 

+ 2 - 4
nb-common/src/main/java/com/nb/common/delay_queue/manager/RedissonDelayMessageManager.java

@@ -15,7 +15,6 @@ import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
 import java.util.*;
@@ -36,18 +35,17 @@ public class RedissonDelayMessageManager implements DelayMessageManager {
 
     private final RDelayedQueue<DelayMessage> delayedQueue;
 
-    private final List<DelayMessageHandler> handlers;
     private static final String NAME="redisson-delay-message-queue";
     @Autowired
     public RedissonDelayMessageManager(RedissonClient redissonClient, List<DelayMessageHandler> handlers) {
         this.blockingQueue = redissonClient.getBlockingQueue(NAME);
         this.delayedQueue = redissonClient.getDelayedQueue(blockingQueue);
-        this.handlers = handlers;
 
+        //将头结点取出后触发该方法
         blockingQueue.subscribeOnElements(i->{
             //开启新的线程消费,唯一线程消费,不可阻塞该异步线程
             CompletableFuture.runAsync(()->{
-                log.info("redisson延迟队列开始消费数据,消息id【{}】,消息内容【{}】",i.getMsgId(),JSONUtil.toJsonStr(i.getBody()));
+                log.info("redisson延迟队列开始消费数据,消息id【{}】,消息内容【{}】",i.getMsgId(),JSONUtil.toJsonStr(i));
                 Optional<DelayMessageHandler> delayMessageHandler = handlers.stream().filter(handler -> ObjectUtil.equals(i.getHandlerId(), handler.getId()))
                         .findFirst()
                         .map(handler -> {

+ 2 - 5
nb-common/src/main/java/com/nb/common/util/MinioUtil.java

@@ -2,10 +2,7 @@ package com.nb.common.util;
 
 import com.nb.common.config.MinioConfig;
 import com.nb.common.exception.CustomException;
-import io.minio.BucketExistsArgs;
-import io.minio.MakeBucketArgs;
-import io.minio.MinioClient;
-import io.minio.PutObjectArgs;
+import io.minio.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Bean;
 import org.springframework.http.MediaType;
@@ -49,7 +46,7 @@ public class MinioUtil {
                     .object(filepath.startsWith("/")?filepath.substring(1):filepath)
                     .contentType(MediaType.APPLICATION_OCTET_STREAM_VALUE)
                     .stream(stream, stream.available(), -1).build();
-            minioClient.putObject(putObjectArgs);
+             minioClient.putObject(putObjectArgs);
         } catch (Exception e) {
             log.error("上传文件失败,{}", e.getMessage());
             throw new CustomException("上传文件失败," + e.getMessage());

+ 5 - 0
nb-framework/pom.xml

@@ -48,6 +48,11 @@
             <artifactId>nb-system</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>org.redisson</groupId>
             <artifactId>redisson-spring-boot-starter</artifactId>

+ 72 - 0
nb-framework/src/main/java/com/nb/framework/logback/SystemLoggingAppender.java

@@ -0,0 +1,72 @@
+package com.nb.framework.logback;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.spi.IThrowableProxy;
+import ch.qos.logback.classic.spi.StackTraceElementProxy;
+import ch.qos.logback.classic.spi.ThrowableProxyUtil;
+import ch.qos.logback.core.CoreConstants;
+import ch.qos.logback.core.UnsynchronizedAppenderBase;
+import cn.hutool.extra.spring.SpringUtil;
+import com.nb.system.entity.SysRunningLog;
+import com.nb.system.mapper.SysRunningLogMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.ApplicationContext;
+
+import java.util.*;
+
+@Slf4j
+public class SystemLoggingAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
+
+    private SysRunningLogMapper logMapper=null;
+    @Override
+    protected void append(ILoggingEvent event) {
+        if(logMapper==null){
+            ApplicationContext applicationContext = SpringUtil.getApplicationContext();
+            logMapper= SpringUtil.getBean(SysRunningLogMapper.class);
+        }
+        if(logMapper==null){
+            return;
+        }
+        StackTraceElement element = event.getCallerData()[0];
+        IThrowableProxy proxies = event.getThrowableProxy();
+        String message = event.getFormattedMessage();
+        String stack;
+        StringJoiner joiner = new StringJoiner("\n", message + "\n[", "]");
+        Queue<IThrowableProxy> queue = new LinkedList<>();
+        queue.add(proxies);
+        while (queue.size() > 0) {
+            IThrowableProxy proxy = queue.poll();
+            if(proxy==null){
+                break;
+            }
+            int commonFrames = proxy.getCommonFrames();
+            StackTraceElementProxy[] stepArray = proxy.getStackTraceElementProxyArray();
+
+            StringBuilder stringBuilder = new StringBuilder();
+            ThrowableProxyUtil.subjoinFirstLine(stringBuilder, proxy);
+            joiner.add(stringBuilder);
+            for (int i = 0; i < stepArray.length - commonFrames; i++) {
+                StringBuilder sb = new StringBuilder();
+                sb.append(CoreConstants.TAB);
+                ThrowableProxyUtil.subjoinSTEP(sb, stepArray[i]);
+                joiner.add(sb);
+            }
+            queue.addAll(Arrays.asList(proxy.getSuppressed()));
+        }
+        stack = joiner.toString();
+
+
+        SysRunningLog info = SysRunningLog.builder()
+                .name(event.getLoggerName())
+                .level(event.getLevel().levelStr)
+                .className(element.getClassName())
+                .methodName(element.getMethodName())
+                .lineNumber(element.getLineNumber())
+                .exceptionStack(stack)
+                .threadName(event.getThreadName())
+                .message(message)
+                .threadId(String.valueOf(Thread.currentThread().getId()))
+                .build();
+        logMapper.insert(info);
+    }
+}

+ 2 - 3
nb-oss/src/main/java/com/nb/oss/strategy/impl/AbstractFileStorage.java

@@ -36,9 +36,8 @@ public abstract class AbstractFileStorage implements FileStorageStrategy {
         if (CharSequenceUtil.isBlank(extName)) {
             extName = FileTypeUtil.getType(file.getInputStream());
         }
-        String filename = IdUtil.fastSimpleUUID() + "." + extName;
-        String filepath = "/" + bizPath + "/" + DateUtil.today() + "/" + filename;
-        return filepath;
+        String filename = bizPath + "." + extName;
+        return "/"+DateUtil.today() + "/" + filename;
     }
 
 }

+ 1 - 0
nb-system/src/main/java/com/nb/bus/hospital/his/HisScriptSession.java

@@ -58,6 +58,7 @@ public class HisScriptSession {
     private LocalBusHospitalLogService hospitalLogService;
     private LocalBusConMixService conMixService;
     private LocalBusConDoctorService conDoctorService;
+    //缓存发给医院的请求,对相同的请求进行批量处理
     private Map<String,HisRequest> hisRequestMap=new ConcurrentHashMap<>();
     public HisScriptSession(String hospitalId, ScriptManager scriptManager, ConfigStorageManager configStorageManager) {
         this.hospitalId = hospitalId;

+ 1 - 18
nb-system/src/main/java/com/nb/bus/hospital/his/HisScriptSessionManager.java

@@ -1,11 +1,6 @@
 package com.nb.bus.hospital.his;
 
 import com.nb.bus.hospital.script.ScriptManager;
-import com.nb.bus.service.LocalBusClinicService;
-import com.nb.bus.service.LocalBusHospitalLogService;
-import com.nb.bus.service.LocalBusHospitalService;
-import com.nb.bus.service.LocalBusPatientService;
-import com.nb.bus.service.constant.LocalBusConMixService;
 import com.nb.common.cache.manager.ClusterConfigStorageManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -23,24 +18,12 @@ import java.util.concurrent.ConcurrentHashMap;
 @Component
 public class HisScriptSessionManager {
     private Map<String,HisScriptSession> sessionMap=new ConcurrentHashMap<>();
-    private LocalBusClinicService clinicService;
     private ScriptManager scriptManager;
-    private LocalBusHospitalService hospitalService;
     private ClusterConfigStorageManager configStorageManager;
-    private LocalBusHospitalLogService hospitalLogService;
-    private LocalBusPatientService patientService;
-    private LocalBusConMixService conMixService;
     @Autowired
-    public HisScriptSessionManager( LocalBusClinicService clinicService, ScriptManager scriptManager, LocalBusHospitalService hospitalService, LocalBusHospitalLogService hospitalLogService, ClusterConfigStorageManager configStorageManager,
-                                    LocalBusPatientService patientService,
-                                    LocalBusConMixService conMixService) {
-        this.clinicService = clinicService;
+    public HisScriptSessionManager(  ScriptManager scriptManager, ClusterConfigStorageManager configStorageManager) {
         this.scriptManager = scriptManager;
-        this.hospitalService = hospitalService;
-        this.hospitalLogService=hospitalLogService;
         this.configStorageManager = configStorageManager;
-        this.patientService=patientService;
-        this.conMixService=conMixService;
     }
 
     /**

+ 45 - 0
nb-system/src/main/java/com/nb/system/controller/SysRunningLogController.java

@@ -0,0 +1,45 @@
+package com.nb.system.controller;
+
+import cn.dev33.satoken.SaManager;
+import cn.dev33.satoken.stp.StpLogic;
+import com.baomidou.mybatisplus.core.mapper.Mapper;
+import com.nb.common.crud.BaseService;
+import com.nb.common.crud.controller.BaseQueryController;
+import com.nb.system.entity.SysRunningLog;
+import com.nb.system.service.impl.LocalSysRunningLogService;
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName SysRunningLogController.java
+ * @Description TODO
+ * @createTime 2022年07月11日 11:04:00
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/sys/rlog")
+@Slf4j
+@Api(tags = "系统运行日志",description = "系统运行日志记录,仅记录ERROR和WARN,查询操作权限【sys:rlog:query】")
+public class SysRunningLogController implements BaseQueryController<SysRunningLog,String> {
+    private final LocalSysRunningLogService logService;
+    @Override
+    public BaseService<? extends Mapper<SysRunningLog>, SysRunningLog, String> getService() {
+        return logService;
+    }
+
+    @Override
+    public String getPermissionPrefix() {
+        return "sys:rlog:";
+    }
+
+    @Override
+    public StpLogic getStpLogin() {
+        return SaManager.getStpLogic("");
+    }
+
+}

+ 44 - 0
nb-system/src/main/java/com/nb/system/entity/SysRunningLog.java

@@ -0,0 +1,44 @@
+package com.nb.system.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.nb.common.entity.GenericEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_running_log")
+@ApiModel("系统线程运行日志")
+public class SysRunningLog extends GenericEntity<String> {
+
+    @ApiModelProperty( "名称")
+    private String name;
+
+    @ApiModelProperty( "线程名")
+    private String threadName;
+
+    @ApiModelProperty( "日志级别")
+    private String level;
+
+    @ApiModelProperty( "类名")
+    private String className;
+
+    @ApiModelProperty( "方法名")
+    private String methodName;
+
+    @ApiModelProperty( "行号")
+    private int lineNumber;
+
+    @ApiModelProperty("日志内容")
+    private String message;
+
+    @ApiModelProperty("异常栈")
+    private String exceptionStack;
+
+    @ApiModelProperty("线程ID")
+    private String threadId;
+}

+ 16 - 0
nb-system/src/main/java/com/nb/system/mapper/SysRunningLogMapper.java

@@ -0,0 +1,16 @@
+package com.nb.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.nb.system.entity.SysRunningLog;
+
+/**
+ * <p>
+ * 部门表 Mapper 接口
+ * </p>
+ *
+ * @author Kevin
+ * @since 2021-06-10
+ */
+public interface SysRunningLogMapper extends BaseMapper<SysRunningLog> {
+
+}

+ 31 - 0
nb-system/src/main/java/com/nb/system/service/impl/LocalSysRunningLogService.java

@@ -0,0 +1,31 @@
+package com.nb.system.service.impl;
+
+import com.nb.common.crud.BaseService;
+import com.nb.system.entity.SysRunningLog;
+import com.nb.system.mapper.SysRunningLogMapper;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName LocalSysRunningLogService.java
+ * @Description TODO
+ * @createTime 2022年07月11日 11:02:00
+ */
+@Service
+public class LocalSysRunningLogService extends BaseService<SysRunningLogMapper, SysRunningLog,String> {
+    @Override
+    public void validateBeforeSave(SysRunningLog entity) {
+
+    }
+
+    @Override
+    public void validateBeforeUpdate(SysRunningLog entity) {
+
+    }
+
+    @Override
+    public void validateBeforeDelete(String id) {
+
+    }
+}

+ 1 - 0
nb-system/src/main/resources/mapper/bus/BusPatientMapper.xml

@@ -343,6 +343,7 @@
         p.alarm as patient_alarm,
         p.`code` as patient_code,
         i.device_id as device_id,
+        i.id as infusion_id,
         i.clinic_id as clinic_id,
         i.classification as classification,
         i.total_dose as total_dose,