‘liusuyi’
2023-09-19 c9768346fc8bc1cc6326e06125deaf57ff423eaf
修改三厂数字化使用原生jdbc连接
已添加2个文件
已修改10个文件
已删除1个文件
515 ■■■■■ 文件已修改
pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/camera/mapper/ArdCamerasMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/digitization/mapper/DataBridgeMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/digitization/service/impl/DataBridgeServiceImpl.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/external/mapper/ArdEquipExternalMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/radar/mapper/ArdEquipRadarMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/stealelec/service/StealElecAlarmService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/config/DruidConfig.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/jdbc/Conn.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/jdbc/Query.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 114 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/logback-spring.xml 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -99,12 +99,6 @@
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.14</version>
        </dependency>
        <!-- åŠ¨æ€æ•°æ®æº -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
src/main/java/com/ard/alarm/camera/mapper/ArdCamerasMapper.java
@@ -2,7 +2,6 @@
import java.util.List;
import com.ard.alarm.camera.domain.ArdCameras;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.apache.ibatis.annotations.Mapper;
/**
@@ -12,7 +11,6 @@
 * @date 2023-02-11
 */
@Mapper
@DS("master")
public interface ArdCamerasMapper 
{
    /**
src/main/java/com/ard/alarm/digitization/mapper/DataBridgeMapper.java
@@ -1,11 +1,9 @@
package com.ard.alarm.digitization.mapper;
import com.ard.alarm.digitization.model.DataBridge;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@DS("oracle")
@Mapper
public interface DataBridgeMapper {
src/main/java/com/ard/alarm/digitization/service/impl/DataBridgeServiceImpl.java
@@ -1,20 +1,19 @@
package com.ard.alarm.digitization.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.ard.alarm.digitization.mapper.DataBridgeMapper;
import com.ard.alarm.digitization.model.DataBridge;
import com.ard.alarm.digitization.service.DataBridgeService;
import com.ard.alarm.stealelec.domain.ArdAlarmStealelec;
import com.ard.utils.jdbc.Query;
import com.ard.utils.mqtt.MqttConsumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * @Description:
@@ -23,29 +22,45 @@
 * @Date: 2023å¹´09月18日16:41:50
 **/
@Service
@Slf4j(topic = "alarm")
@Slf4j(topic = "digitization3")
public class DataBridgeServiceImpl implements DataBridgeService {
    @Resource
    DataBridgeMapper databridgeMapper;
    public static Date lastTime;
    @Value("${spring.digitization3.enabled}")
    private Boolean enabled;
    @Scheduled(cron = "0/5 * * * * ?")
    public void alarmHandler() {
        List<DataBridge> dataBridgeList;
        try {
            List<DataBridge> dataBridgeList = selectDatabridgeList(new DataBridge());
            if(!enabled)
            {
                return;
            }
            if (lastTime == null) {
                //初次查询,只获取10条最近数据。
                dataBridgeList = Query.getAlarmData(null, 10);
                if (dataBridgeList.size() > 0) {
                    lastTime = dataBridgeList.get(0).getDateTime();
                }
            } else {
                //查询大于上次查询最后一条数据的时间
                dataBridgeList = Query.getAlarmData(lastTime, null);
            }
            if (dataBridgeList.size() > 0) {
                for (DataBridge data : dataBridgeList) {
                    String[] elem = data.getValue().split(";");
                    data.setWellNo(elem[0]);
                    data.setAlarmType(elem[1]);
                    data.setAlarmTime(elem[2]);
                    MqttConsumer.publish(2, false, "digitization3", JSON.toJSONString(data));
                }
            }
        } catch (Exception ex) {
            log.error("3厂数字化报警数据推送异常:" + ex.getMessage());
            log.error("3厂数字化报警数据处理异常:" + ex.getMessage());
        }
    }
src/main/java/com/ard/alarm/external/mapper/ArdEquipExternalMapper.java
@@ -2,7 +2,6 @@
import java.util.List;
import com.ard.alarm.external.domain.ArdEquipExternal;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.apache.ibatis.annotations.Mapper;
@@ -13,7 +12,6 @@
 * @date 2023-03-13
 */
@Mapper
@DS("master")
public interface ArdEquipExternalMapper 
{
    /**
src/main/java/com/ard/alarm/radar/mapper/ArdEquipRadarMapper.java
@@ -2,7 +2,6 @@
import java.util.List;
import com.ard.alarm.radar.domain.ArdEquipRadar;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.apache.ibatis.annotations.Mapper;
/**
@@ -12,7 +11,6 @@
 * @date 2023-03-11
 */
@Mapper
@DS("master")
public interface ArdEquipRadarMapper 
{
    /**
src/main/java/com/ard/alarm/stealelec/service/StealElecAlarmService.java
@@ -10,6 +10,7 @@
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@@ -24,12 +25,15 @@
 */
@Slf4j(topic = "stealAlarm")
@Service
public class StealElecAlarmService{
public class StealElecAlarmService {
    @Resource
    RestTemplate restTemplate;
    @Value("${spring.stealelec.url}")
    private String stealElecUrl;
    List<String> tempList=new ArrayList<>();
    @Value("${spring.stealelec.enabled}")
    private Boolean enabled;
    List<String> tempList = new ArrayList<>();
    /**
     * @描述 èŽ·å–api数据推送mqtt
     * @参数 []
@@ -39,9 +43,12 @@
     * @修改人和其它信息
     */
    @Async("alarm")
   // @Scheduled(cron="0/5 * * * * ?")
    @Scheduled(cron = "0/5 * * * * ?")
    public void alarmHandler() {
        try {
            if (!enabled) {
                return;
            }
            String allAlarmData = restTemplate.getForObject(stealElecUrl, String.class);
            //剔除所有\符号
            String message = allAlarmData.replaceAll("\\\\", "");
@@ -60,11 +67,10 @@
                    String JSONStr = JSON.toJSONString(object);
                    //转成实体对象
                    ArdAlarmStealelec wd = JSON.parseObject(JSONStr, ArdAlarmStealelec.class);
                    if(tempList.contains(wd.getId()))
                    {
                    if (tempList.contains(wd.getId())) {
                        continue;
                    }
                    MqttConsumer.publish(2,false,"stealelec", JSON.toJSONString(wd));
                    MqttConsumer.publish(2, false, "stealelec", JSON.toJSONString(wd));
                    tempList.add(wd.getId());
                }
            }
src/main/java/com/ard/config/DruidConfig.java
ÎļþÒÑɾ³ý
src/main/java/com/ard/utils/jdbc/Conn.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,103 @@
package com.ard.utils.jdbc;
/**
 * @Description:
 * @ClassName: GetConn
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´09月19日13:12:38
 **/
import org.springframework.core.io.ClassPathResource;
import javax.annotation.Resource;
import java.sql.*;
import java.util.Properties;
public class Conn {
    //jdbc连接需要用到的三个参数
    private String url="jdbc:oracle:thin:@//112.98.126.2:21521/orcl";
    private String user="c##ard_user";
    private String pwd="123456";
    //创建一个对象 è®¾ç½®ä¸ºé™æ€ç§æœ‰  ï¼ˆå•例模式)
    private static Conn gc=null;
    //将构造函数设为private型 é˜²æ­¢å¤–部实例化对象  ï¼ˆé€šè¿‡åå°„或反序列化可以破解单例)
    private Conn(){};
    //静态代码块,在类加载进内存时就完成对对象的特殊的初始化(这个动作发生在类的构造器执行之前,也就是在没有对象存在的情况下,静态代码就已经完成了对对象的特殊的处理 ï¼‰ï¼Œæ­¤å¤„的作用是,当jdbc的驱动器加载时,就自动创建一个自己。
    static{
        try {
            //注册驱动
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //判断GetConn实例化的对象是否存在  ä¸å­˜åœ¨å°±å®žä¾‹åŒ–一个
    //synchronized  çº¿ç¨‹é”  é˜²æ­¢å¤šä¸ªçº¿ç¨‹æŠ¢å èµ„源   é˜²æ­¢æ­»é”
    public static Conn getGc(){
        if(gc==null){
            synchronized (Conn.class) {
                if(gc==null){
                    gc=new Conn();
                }
            }
        }
        return gc;
    }
    //返回一个Connection连接
    public Connection getCon() throws SQLException{
        return DriverManager.getConnection(url, user, pwd);
    }
    //释放资源
    public void closeAll(ResultSet rs, Statement st, Connection con){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                if(st!=null){
                    try {
                        st.close();
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }finally{
                        if(con!=null){
                            try {
                                con.close();
                            } catch (SQLException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
        if(st!=null){
            try {
                st.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                if(con!=null){
                    try {
                        con.close();
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
src/main/java/com/ard/utils/jdbc/Query.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.ard.utils.jdbc;
/**
 * @Description:
 * @ClassName: Query
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´09月19日13:01:28
 **/
import com.ard.alarm.digitization.model.DataBridge;
import lombok.extern.slf4j.Slf4j;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Slf4j(topic = "digitization3")
public class Query {
    static Connection conn = null;
    static Statement st = null;
    static ResultSet rs = null;
    public static List<DataBridge> getAlarmData(Date alarmTime, Integer rowNum) {
        List<DataBridge> dataBridgeList = new ArrayList<>();
        try {
            //1、获取连接对象
            conn = Conn.getGc().getCon();
            //2、创建statement类对象,用来执行SQL语句
            st = conn.createStatement();
            //3、创建sql查询语句
            StringBuilder sbd = new StringBuilder();
            String sql = "select * from (select * from DATABRIDGE  order by DB_DATETIME desc ) where 1=1 ";
            sbd.append(sql);
            if (rowNum != null) {
                sbd.append(" and rownum <" + rowNum);
            }
            if (alarmTime != null) {
                SimpleDateFormat fmt = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
                String Time = fmt.format(alarmTime);
                sbd.append(" and DB_DATETIME > to_date('" + Time + "','yyyy/mm/dd hh24:mi:ss')");
            }
            //4、执行sql语句并且换回一个查询的结果集
            rs = st.executeQuery(sbd.toString());
            while (rs.next()) {  //循环遍历结果集
                DataBridge dataBridge = new DataBridge();
                dataBridge.setId(rs.getString("DB_GUID"));
                dataBridge.setXmmc(rs.getString("DB_XMMC"));
                dataBridge.setFKey(rs.getString("DB_FKEY"));
                dataBridge.setFName(rs.getString("DB_FNAME"));
                dataBridge.setValue(rs.getString("DB_VALUE"));
                dataBridge.setDateTime(rs.getTimestamp("DB_DATETIME"));
                dataBridgeList.add(dataBridge);
            }
            return dataBridgeList;
        } catch (Exception e) {
            log.error("三厂数字化报警查询异常:" + e.getMessage());
            return dataBridgeList;
        } finally {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
src/main/resources/application-dev.yml
@@ -9,90 +9,26 @@
      max-file-size: 30MB
      max-request-size: 30MB
  datasource:
    dynamic:
      primary: postgres #设置默认的数据源或者数据源组
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      druid: # å…¨å±€druid参数,单独数据源配置为空时取全局配置
        # è¿žæŽ¥æ± çš„配置信息
        # åˆå§‹åŒ–大小,最小,最大
        initial-size: 1
        min-idle: 2
        maxActive: 8
        # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´
        maxWait: 60000
        # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        timeBetweenEvictionRunsMillis: 60000
        # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        # æ‰“å¼€PSCache,并且指定每个连接上PSCache的大小
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        # é…ç½®ç›‘控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        filters: stat,wall,slf4j
        # é€šè¿‡connectProperties属性来打开mergeSql功能;慢SQL记录
        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
      datasource:
        master:
          url: jdbc:postgresql://192.168.2.15:5432/ry-vue
          username: postgres
          password: postgres
          driver-class-name: org.postgresql.Driver
          druid: # é…ç½®multi-datasource1 æ•°æ®æºè¿žæŽ¥æ± å‚æ•°
            # è¿žæŽ¥æ± çš„配置信息
            # åˆå§‹åŒ–大小,最小,最大
            initial-size: 2
            min-idle: 2
            maxActive: 2
            # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´
            maxWait: 600000
            # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            timeBetweenEvictionRunsMillis: 60000
            # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
            minEvictableIdleTimeMillis: 300000
            validationQuery: SELECT 1
            testWhileIdle: true
            testOnBorrow: false
            testOnReturn: false
            # æ‰“å¼€PSCache,并且指定每个连接上PSCache的大小
            poolPreparedStatements: true
            maxPoolPreparedStatementPerConnectionSize: 20
            # é…ç½®ç›‘控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
            filters: stat,wall,slf4j
            # é€šè¿‡connectProperties属性来打开mergeSql功能;慢SQL记录
            connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
        oracle:
          url: jdbc:oracle:thin:@//112.98.126.2:21521/orcl
          username: c##ard_user
          password: 123456
          driver-class-name: oracle.jdbc.driver.OracleDriver
          druid: #配置mysql é»˜è®¤è¿žæŽ¥æ± å‚æ•°
            # è¿žæŽ¥æ± çš„配置信息
            # åˆå§‹åŒ–大小,最小,最大
            initial-size: 3
            min-idle: 3
            maxActive: 8
            # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´
            maxWait: 600000
            # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            timeBetweenEvictionRunsMillis: 60000
            # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
            minEvictableIdleTimeMillis: 300000
            validationQuery: SELECT 1 FROM DUAL
            testWhileIdle: true
            testOnBorrow: false
            testOnReturn: false
            # æ‰“å¼€PSCache,并且指定每个连接上PSCache的大小
            poolPreparedStatements: true
            maxPoolPreparedStatementPerConnectionSize: 20
            # é…ç½®ç›‘控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
            filters: stat,wall,slf4j
            # é€šè¿‡connectProperties属性来打开mergeSql功能;慢SQL记录
            connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
    druid:
      #开启druid监控web
      stat-view-servlet:
        enabled: true
      driver-class-name: org.postgresql.Driver
      url: jdbc:postgresql://192.168.2.15:5432/ry-vue
      username: postgres
      password: postgres
      #最大连接数
      maxActive: 30
      #最小连接数
      minIdle: 5
      #获取连接的最大等待时间
      maxWait: 10000
      #解决mysql8小时的问题
      validation-query: SELECT 'X'
      #空闲连接的检查时间间隔
      timeBetweenEvictionRunsMillis: 60000
      #空闲连接最小空闲时间
      minEvictableIdleTimeMillis: 300000
  # netty配置
  netty:
    udp:
@@ -112,7 +48,11 @@
    enabled: true
  # ç›—电接口地址
  stealelec:
    enabled: false
    url: http://iot.zhdk.net:8090/Warning/GetWarning?userName=cy4oil
  # ä¸‰åŽ‚æ•°å­—åŒ–åœ°å€
  digitization3:
    enabled: true
  # minio配置
  minio:
    endpoint: http://192.168.2.15:9001
@@ -126,8 +66,10 @@
logging:
  level:
    hikSdk: info
    mqtt: debug
    netty: debug
    mqtt: info
    netty: info
    external: info
    camera: info
    tube: info
    digitization3: debug
    stealAlarm: info
src/main/resources/application-prod.yml
@@ -49,8 +49,13 @@
    timeout: 100
    keepalive: 60
    enabled: true
  # ç›—电接口地址
  stealelec:
    enabled: false
    url: http://iot.zhdk.net:8090/Warning/GetWarning?userName=cy4oil
  # ä¸‰åŽ‚æ•°å­—åŒ–åœ°å€
  digitization3:
    enabled: false
mybatis:
  typeAliasesPackage: com.ard.alarm.**.domain
  mapperLocations: classpath:/mapper/*.xml
@@ -60,7 +65,7 @@
logging:
  level:
    hikSdk: debug
    mqtt: info
    mqtt: debug
    netty: info
    external: info
    camera: info
src/main/resources/logback-spring.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--日志存放路径-->
    <property name="log.path" value="./alarmLogs"/>
    <property name="log.path" value="./logs"/>
    <!--日志输出格式-->
    <property name="log.pattern" value="%d{HH:mm:ss.SSS}[%thread]%-5level%logger{20}-[%method,%line]-%msg%n"/>
    <!--控制台输出-->
@@ -45,14 +45,6 @@
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--过滤的级别-->
            <level>INFO</level>
            <!--匹配时的操作:接收(记录)-->
            <onMatch>ACCEPT</onMatch>
            <!--不匹配时的操作:拒绝(不记录)-->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--通用光电报警日志输出-->
    <appender name="camera" class="ch.qos.logback.core.rolling.RollingFileAppender">
@@ -67,14 +59,6 @@
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--过滤的级别-->
            <level>INFO</level>
            <!--匹配时的操作:接收(记录)-->
            <onMatch>ACCEPT</onMatch>
            <!--不匹配时的操作:拒绝(不记录)-->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--外联设备报警日志输出-->
    <appender name="external" class="ch.qos.logback.core.rolling.RollingFileAppender">
@@ -89,14 +73,6 @@
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--过滤的级别-->
            <level>INFO</level>
            <!--匹配时的操作:接收(记录)-->
            <onMatch>ACCEPT</onMatch>
            <!--不匹配时的操作:拒绝(不记录)-->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--Netty日志输出-->
    <appender name="netty" class="ch.qos.logback.core.rolling.RollingFileAppender">
@@ -111,16 +87,8 @@
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--过滤的级别-->
            <level>INFO</level>
            <!--匹配时的操作:接收(记录)-->
            <onMatch>ACCEPT</onMatch>
            <!--不匹配时的操作:拒绝(不记录)-->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--Mqtt日志输出-->
    <!--mqtt日志输出-->
    <appender name="mqtt" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/mqtt.log</file>
        <!--循环政策:基于时间创建日志文件-->
@@ -133,14 +101,6 @@
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--过滤的级别-->
            <level>INFO</level>
            <!--匹配时的操作:接收(记录)-->
            <onMatch>ACCEPT</onMatch>
            <!--不匹配时的操作:拒绝(不记录)-->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--hikSdk日志输出-->
    <appender name="hikSdk" class="ch.qos.logback.core.rolling.RollingFileAppender">
@@ -155,6 +115,33 @@
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!--stealAlarm日志输出-->
    <appender name="stealAlarm" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/stealAlarm.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--按天回滚daily-->
            <fileNamePattern>${log.path}/stealAlarm.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--日志最大的历史60天-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!--digitization3日志输出-->
    <appender name="digitization3" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/digitization3.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--按天回滚daily-->
            <fileNamePattern>${log.path}/digitization3.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--日志最大的历史60天-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="console"/>
    </root>
@@ -162,5 +149,39 @@
    <root level="INFO">
        <appender-ref ref="sys-info"/>
    </root>
    <!--tube操作日志-->
    <logger name="tube" level="INFO">
        <appender-ref ref="tube"/>
    </logger>
    <!--camera操作日志-->
    <logger name="camera" level="INFO">
        <appender-ref ref="camera"/>
    </logger>
    <!--external操作日志-->
    <logger name="external" level="INFO">
        <appender-ref ref="external"/>
    </logger>
    <!--netty操作日志-->
    <logger name="netty" level="INFO">
        <appender-ref ref="netty"/>
    </logger>
    <!--mqtt操作日志-->
    <logger name="mqtt" level="DEBUG">
        <appender-ref ref="mqtt"/>
    </logger>
    <!--hikSdk操作日志-->
    <logger name="hikSdk" level="INFO">
        <appender-ref ref="hikSdk"/>
    </logger>
    <!--digitization3操作日志-->
    <logger name="digitization3" level="INFO">
        <appender-ref ref="digitization3"/>
    </logger>
    <!--stealAlarm操作日志-->
    <logger name="stealAlarm" level="INFO">
        <appender-ref ref="stealAlarm"/>
    </logger>
</configuration>