省厅版本位置汇聚修改

stwzhj
luyya 2025-07-07 16:58:08 +08:00
parent 569c86fe18
commit 8febeeb5e4
14 changed files with 471 additions and 278 deletions

View File

@ -1,28 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 --> <!-- 日志存放路径 -->
<property name="log.path" value="logs/${project.artifactId}"/> <property name="log.path" value="logs" />
<property name="log.file" value="auth" />
<property name="MAX_FILE_SIZE" value="50MB" />
<property name="MAX_HISTORY" value="30" />
<!-- 日志输出格式 --> <!-- 日志输出格式 -->
<property name="console.log.pattern" <!-- INFO日志Appender -->
value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/> <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.${log.file}.log</file>
<!-- 控制台输出 --> <filter class="ch.qos.logback.classic.filter.LevelFilter">
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder> <encoder>
<pattern>${console.log.pattern}</pattern> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder> </encoder>
</appender> </appender>
<include resource="logback-common.xml" /> <!-- ERROR日志Appender -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<include resource="logback-logstash.xml" /> <!-- 根Logger配置禁用控制台输出 -->
<root level="INFO">
<!-- 开启 skywalking 日志收集 --> <appender-ref ref="FILE_INFO" />
<include resource="logback-skylog.xml" /> <appender-ref ref="FILE_ERROR" />
<!--系统操作日志-->
<root level="info">
<appender-ref ref="console"/>
</root> </root>
</configuration> </configuration>

View File

@ -17,11 +17,14 @@ public class RedisConstants {
public static final String ONLINE_USERS_GEO = "geo_hash"; public static final String ONLINE_USERS_GEO = "geo_hash";
public static final long REDIS_ONLINE_USER_EXPIRE_TIME = 60 * 60 * 24; public static final long REDIS_NEVER_EXPIRE = 0L;
public static final long FIVE_MINUTES_REDIS_ONLINE_USER_EXPIRE_TIME = 60 * 5;
public static final String ONLINE_USERS_TEN = "ten:online_users:";
public static final long REDIS_ONLINE_USER_NEVER_EXPIRE = -1; public static final long REDIS_ONLINE_USER_NEVER_EXPIRE = -1;
public static final long FIVE_MINUTES_REDIS_ONLINE_USER_EXPIRE_TIME = 60 * 5;
public static String getUserTokenKey(String token) { public static String getUserTokenKey(String token) {

View File

@ -1,114 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 --> <!-- 日志存放路径 -->
<property name="log.path" value="logs/${project.artifactId}"/> <property name="log.path" value="logs" />
<property name="log.file" value="gateway" />
<property name="MAX_FILE_SIZE" value="50MB" />
<property name="MAX_HISTORY" value="30" />
<!-- 日志输出格式 --> <!-- 日志输出格式 -->
<property name="console.log.pattern" <!-- INFO日志Appender -->
value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/> <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/> <file>${log.path}/info.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 控制台输出 --> <level>INFO</level>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder> <encoder>
<pattern>${console.log.pattern}</pattern> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder> </encoder>
</appender> </appender>
<!-- 控制台输出 --> <!-- ERROR日志Appender -->
<appender name="file_console" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/console.log</file> <file>${log.path}/error.${log.file}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/console.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大 1天 -->
<maxHistory>1</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
</filter>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<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="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level> <level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter> </filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender> </appender>
<!-- info异步输出 --> <!-- 根Logger配置禁用控制台输出 -->
<appender name="async_info" class="ch.qos.logback.classic.AsyncAppender"> <root level="INFO">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --> <appender-ref ref="FILE_INFO" />
<discardingThreshold>0</discardingThreshold> <appender-ref ref="FILE_ERROR" />
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="file_info"/>
</appender>
<!-- error异步输出 -->
<appender name="async_error" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="file_error"/>
</appender>
<include resource="logback-logstash.xml" />
<!-- 开启 skywalking 日志收集 -->
<include resource="logback-skylog.xml" />
<!--系统操作日志-->
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="async_info"/>
<appender-ref ref="async_error"/>
<appender-ref ref="file_console"/>
</root> </root>
</configuration> </configuration>

View File

@ -1,28 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 --> <!-- 日志存放路径 -->
<property name="log.path" value="logs/${project.artifactId}" /> <property name="log.path" value="logs" />
<!-- 日志输出格式 --> <property name="log.file" value="base2st" />
<property name="console.log.pattern" <property name="MAX_FILE_SIZE" value="50MB" />
value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/> <property name="MAX_HISTORY" value="30" />
<!-- 日志输出格式 -->
<!-- 控制台输出 --> <!-- INFO日志Appender -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder> <encoder>
<pattern>${console.log.pattern}</pattern> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder> </encoder>
</appender> </appender>
<include resource="logback-common.xml" /> <!-- ERROR日志Appender -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<include resource="logback-logstash.xml" /> <!-- 根Logger配置禁用控制台输出 -->
<root level="INFO">
<!-- 开启 skywalking 日志收集 --> <appender-ref ref="FILE_INFO" />
<include resource="logback-skylog.xml" /> <appender-ref ref="FILE_ERROR" />
<!--系统操作日志-->
<root level="info">
<appender-ref ref="console" />
</root> </root>
</configuration> </configuration>

View File

@ -1,28 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 --> <!-- 日志存放路径 -->
<property name="log.path" value="logs/${project.artifactId}" /> <property name="log.path" value="logs" />
<!-- 日志输出格式 --> <property name="log.file" value="consumer" />
<property name="console.log.pattern" <property name="MAX_FILE_SIZE" value="50MB" />
value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/> <property name="MAX_HISTORY" value="30" />
<!-- 日志输出格式 -->
<!-- 控制台输出 --> <!-- INFO日志Appender -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder> <encoder>
<pattern>${console.log.pattern}</pattern> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder> </encoder>
</appender> </appender>
<include resource="logback-common.xml" /> <!-- ERROR日志Appender -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<include resource="logback-logstash.xml" /> <!-- 根Logger配置禁用控制台输出 -->
<root level="INFO">
<!-- 开启 skywalking 日志收集 --> <appender-ref ref="FILE_INFO" />
<include resource="logback-skylog.xml" /> <appender-ref ref="FILE_ERROR" />
<!--系统操作日志-->
<root level="info">
<appender-ref ref="console" />
</root> </root>
</configuration> </configuration>

View File

@ -2,11 +2,14 @@ package org.dromara.data2es.handler;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.dromara.common.core.utils.RedisConstants; import org.dromara.common.core.utils.RedisConstants;
import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.data2es.controller.DataToEsController; import org.dromara.data2es.controller.DataToEsController;
import org.dromara.data2es.domain.EsGpsInfoVO2; import org.dromara.data2es.domain.EsGpsInfoVO2;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -19,6 +22,7 @@ import org.springframework.stereotype.Component;
import java.util.Date; import java.util.Date;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit;
/** /**
* <p>description: </p> * <p>description: </p>
@ -27,6 +31,7 @@ import java.util.Objects;
* @date 2021-11-08 16:40 * @date 2021-11-08 16:40
*/ */
@Component @Component
@Slf4j
public class RedisExpireListener extends KeyExpirationEventMessageListener { public class RedisExpireListener extends KeyExpirationEventMessageListener {
@Autowired @Autowired
@ -48,23 +53,37 @@ public class RedisExpireListener extends KeyExpirationEventMessageListener {
public void onMessage(Message message, byte[] pattern) { public void onMessage(Message message, byte[] pattern) {
String expireKey = message.toString(); String expireKey = message.toString();
if(StringUtils.isNotEmpty(expireKey) && if(StringUtils.isNotEmpty(expireKey) &&
expireKey.startsWith(RedisConstants.ORG_CODE_PRE)){ expireKey.startsWith(RedisConstants.ORG_CODE_PRE)){
String[] split = expireKey.split(":"); handleExpiredEvent(expireKey);
EsGpsInfoVO2 esGpsInfoVO2 = new EsGpsInfoVO2(); }
esGpsInfoVO2.setDeviceType(split[2]); }
esGpsInfoVO2.setDeviceCode(split[3]);
String zzjgdm = split[1]; private void handleExpiredEvent(String expiredKey) {
String deviceType = split[2]; RedissonClient redisson = RedisUtils.getClient();
String deviceCode = split[3]; RLock lock = redisson.getLock("LOCK:" + expiredKey);
if(StringUtils.isNotEmpty(zzjgdm)) { try {
JSONObject object = RedisUtils.getBucket(RedisConstants.ONLINE_USERS + zzjgdm + ":" if (lock.tryLock(0, 30, TimeUnit.SECONDS)) {
+ deviceType+":"+deviceCode); // 实际业务逻辑
String[] split = expiredKey.split(":");
String zzjgdm = split[1];
String deviceType = split[2];
String deviceCode = split[3];
log.error("redis key expired:key={}",expiredKey);
JSONObject object = RedisUtils.getBucket(RedisConstants.ONLINE_USERS+ zzjgdm +":" + deviceType+":"+deviceCode);
if (Objects.isNull(object)) {
log.info("redis key={},Object=nulldeviceType={},deviceCode={}", expiredKey,deviceType,deviceCode);
return;
}
EsGpsInfoVO2 gpsInfo = BeanUtil.toBean(object, EsGpsInfoVO2.class); EsGpsInfoVO2 gpsInfo = BeanUtil.toBean(object, EsGpsInfoVO2.class);
gpsInfo.setGpsTime(new Date());
gpsInfo.setOnline(0); gpsInfo.setOnline(0);
dataToEsController.saveGpsInfo(gpsInfo); dataToEsController.saveGpsInfo(gpsInfo);
log.info("redis key expired:key={}", expiredKey);
} }
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
} }
logger.info("redis key expired:key={}", expireKey);
} }
} }

View File

@ -4,12 +4,14 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.RedisConstants; import org.dromara.common.core.utils.RedisConstants;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.data2es.domain.EsGpsInfo; import org.dromara.data2es.domain.EsGpsInfo;
import org.dromara.data2es.domain.EsGpsInfoVO2; import org.dromara.data2es.domain.EsGpsInfoVO2;
import org.dromara.data2es.domain.entity.GpsInfoEntity; import org.dromara.data2es.domain.entity.GpsInfoEntity;
@ -139,7 +141,9 @@ public class GpsServiceImpl implements IGpsService {
EsGpsInfoVO2 esGpsInfoVO2 = new EsGpsInfoVO2(); EsGpsInfoVO2 esGpsInfoVO2 = new EsGpsInfoVO2();
BeanUtil.copyProperties(esGpsInfo,esGpsInfoVO2); BeanUtil.copyProperties(esGpsInfo,esGpsInfoVO2);
if(null == esGpsInfoVO2.getZzjgdm() || "".equals(esGpsInfoVO2.getZzjgdm())){ if(null == esGpsInfoVO2.getZzjgdm() || "".equals(esGpsInfoVO2.getZzjgdm())){
RemoteDeviceVo vo = deviceService.getDeviceInfo(esGpsInfoVO2.getDeviceCode(),esGpsInfoVO2.getDeviceType()); //查询Redis的设备信息
JSONObject obj = RedisUtils.getBucket("deviceInfo:"+esGpsInfo.getInfoSource()+":"+esGpsInfo.getDeviceCode());
RemoteDeviceVo vo = BeanUtil.toBean(obj,RemoteDeviceVo.class);
if (null != vo){ if (null != vo){
esGpsInfoVO2.setZzjgdm(vo.getZzjgdm()); esGpsInfoVO2.setZzjgdm(vo.getZzjgdm());
esGpsInfoVO2.setZzjgmc(vo.getZzjgmc()); esGpsInfoVO2.setZzjgmc(vo.getZzjgmc());

View File

@ -1,28 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 --> <!-- 日志存放路径 -->
<property name="log.path" value="logs/${project.artifactId}" /> <property name="log.path" value="logs" />
<!-- 日志输出格式 --> <property name="log.file" value="data2es" />
<property name="console.log.pattern" <property name="MAX_FILE_SIZE" value="50MB" />
value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/> <property name="MAX_HISTORY" value="30" />
<!-- 日志输出格式 -->
<!-- 控制台输出 --> <!-- INFO日志Appender -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder> <encoder>
<pattern>${console.log.pattern}</pattern> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder> </encoder>
</appender> </appender>
<include resource="logback-common.xml" /> <!-- ERROR日志Appender -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<include resource="logback-logstash.xml" /> <!-- 根Logger配置禁用控制台输出 -->
<root level="INFO">
<!-- 开启 skywalking 日志收集 --> <appender-ref ref="FILE_INFO" />
<include resource="logback-skylog.xml" /> <appender-ref ref="FILE_ERROR" />
<!--系统操作日志-->
<root level="info">
<appender-ref ref="console" />
</root> </root>
</configuration> </configuration>

View File

@ -1,28 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 --> <!-- 日志存放路径 -->
<property name="log.path" value="logs/${project.artifactId}" /> <property name="log.path" value="logs" />
<!-- 日志输出格式 --> <property name="log.file" value="data2gaus" />
<property name="console.log.pattern" <property name="MAX_FILE_SIZE" value="50MB" />
value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/> <property name="MAX_HISTORY" value="30" />
<!-- 日志输出格式 -->
<!-- 控制台输出 --> <!-- INFO日志Appender -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder> <encoder>
<pattern>${console.log.pattern}</pattern> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder> </encoder>
</appender> </appender>
<include resource="logback-common.xml" /> <!-- ERROR日志Appender -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<include resource="logback-logstash.xml" /> <!-- 根Logger配置禁用控制台输出 -->
<root level="INFO">
<!-- 开启 skywalking 日志收集 --> <appender-ref ref="FILE_INFO" />
<include resource="logback-skylog.xml" /> <appender-ref ref="FILE_ERROR" />
<!--系统操作日志-->
<root level="info">
<appender-ref ref="console" />
</root> </root>
</configuration> </configuration>

View File

@ -1,28 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 --> <!-- 日志存放路径 -->
<property name="log.path" value="logs/${project.artifactId}" /> <property name="log.path" value="logs" />
<!-- 日志输出格式 --> <property name="log.file" value="location" />
<property name="console.log.pattern" <property name="MAX_FILE_SIZE" value="50MB" />
value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/> <property name="MAX_HISTORY" value="30" />
<!-- 日志输出格式 -->
<!-- 控制台输出 --> <!-- INFO日志Appender -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder> <encoder>
<pattern>${console.log.pattern}</pattern> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder> </encoder>
</appender> </appender>
<include resource="logback-common.xml" /> <!-- ERROR日志Appender -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<include resource="logback-logstash.xml" /> <!-- 根Logger配置禁用控制台输出 -->
<root level="INFO">
<!-- 开启 skywalking 日志收集 --> <appender-ref ref="FILE_INFO" />
<include resource="logback-skylog.xml" /> <appender-ref ref="FILE_ERROR" />
<!--系统操作日志-->
<root level="info">
<appender-ref ref="console" />
</root> </root>
</configuration> </configuration>

View File

@ -1,28 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 --> <!-- 日志存放路径 -->
<property name="log.path" value="logs/${project.artifactId}"/> <property name="log.path" value="logs" />
<property name="log.file" value="resource" />
<property name="MAX_FILE_SIZE" value="50MB" />
<property name="MAX_HISTORY" value="30" />
<!-- 日志输出格式 --> <!-- 日志输出格式 -->
<property name="console.log.pattern" <!-- INFO日志Appender -->
value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/> <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.${log.file}.log</file>
<!-- 控制台输出 --> <filter class="ch.qos.logback.classic.filter.LevelFilter">
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder> <encoder>
<pattern>${console.log.pattern}</pattern> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder> </encoder>
</appender> </appender>
<include resource="logback-common.xml" /> <!-- ERROR日志Appender -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<include resource="logback-logstash.xml" /> <!-- 根Logger配置禁用控制台输出 -->
<root level="INFO">
<!-- 开启 skywalking 日志收集 --> <appender-ref ref="FILE_INFO" />
<include resource="logback-skylog.xml" /> <appender-ref ref="FILE_ERROR" />
<!--系统操作日志-->
<root level="info">
<appender-ref ref="console"/>
</root> </root>
</configuration> </configuration>

View File

@ -1,29 +1,72 @@
package org.dromara.system.schedule; package org.dromara.system.schedule;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.RedisConstants;
import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.system.domain.DeviceRedis; import org.dromara.system.domain.DeviceRedis;
import org.dromara.system.domain.bo.TDeviceBo;
import org.dromara.system.domain.vo.TDeviceVo;
import org.dromara.system.service.IDeviceRedisService; import org.dromara.system.service.IDeviceRedisService;
import org.dromara.system.service.ITDeviceService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
@Configuration @Configuration
@Slf4j
public class DeviceRedisSchedule { public class DeviceRedisSchedule {
@Autowired @Autowired
IDeviceRedisService redisService; IDeviceRedisService redisService;
@Autowired
ITDeviceService deviceService;
@Value("${deviceInfo.lastUpdateTime}")
private String lastUpdateTime;
/* /*
* Redis online_usert_device_redis * Redis online_usert_device_redis
* */ * */
@Scheduled(cron = "0/30 * * * * ?") // @Scheduled(cron = "0/30 * * * * ?")
public void handleDeviceRedis(){ public void handleDeviceRedis(){
List<JSONObject> jlist = RedisUtils.searchAndGetKeysValues("online_users:*"); List<JSONObject> jlist = RedisUtils.searchAndGetKeysValues("online_users:*");
redisService.insertBatch(BeanUtil.copyToList(jlist, DeviceRedis.class)); redisService.insertBatch(BeanUtil.copyToList(jlist, DeviceRedis.class));
} }
@PostConstruct
@Scheduled(cron = "0 0 0/2 * * ?")
public void handleDeviceInfoToRedis(){
if (null == lastUpdateTime || "".equals(lastUpdateTime)){
log.error("lastUpdateTime=null");
}
TDeviceBo bo = new TDeviceBo();
bo.setBeginTime(lastUpdateTime);
bo.setEndTime(DateUtil.formatDateTime(new Date()));
List<TDeviceVo> list = deviceService.queryList(bo);
if (list.size() >0){
lastUpdateTime = list.get(0).getUpdateTime();
}
Map<String, String> deviceInfoDataMap = new HashMap<>();
for (TDeviceVo vo : list) {
String jsonValue = JSONUtil.toJsonStr(vo);
String infoKey = "deviceInfo:"+vo.getInfoSource()+":"+vo.getDeviceCode();
deviceInfoDataMap.put(infoKey, jsonValue);
}
RedisUtils.batchInsert(deviceInfoDataMap,-1);
}
} }

View File

@ -1,28 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 --> <!-- 日志存放路径 -->
<property name="log.path" value="logs/${project.artifactId}" /> <property name="log.path" value="logs" />
<!-- 日志输出格式 --> <property name="log.file" value="system" />
<property name="console.log.pattern" <property name="MAX_FILE_SIZE" value="50MB" />
value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/> <property name="MAX_HISTORY" value="30" />
<!-- 日志输出格式 -->
<!-- 控制台输出 --> <!-- INFO日志Appender -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder> <encoder>
<pattern>${console.log.pattern}</pattern> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder> </encoder>
</appender> </appender>
<include resource="logback-common.xml" /> <!-- ERROR日志Appender -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<include resource="logback-logstash.xml" /> <!-- 根Logger配置禁用控制台输出 -->
<root level="INFO">
<!-- 开启 skywalking 日志收集 --> <appender-ref ref="FILE_INFO" />
<include resource="logback-skylog.xml" /> <appender-ref ref="FILE_ERROR" />
<!--系统操作日志-->
<root level="info">
<appender-ref ref="console" />
</root> </root>
</configuration> </configuration>

View File

@ -1,28 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 --> <!-- 日志存放路径 -->
<property name="log.path" value="logs/${project.artifactId}" /> <property name="log.path" value="logs" />
<!-- 日志输出格式 --> <property name="log.file" value="monitor" />
<property name="console.log.pattern" <property name="MAX_FILE_SIZE" value="50MB" />
value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/> <property name="MAX_HISTORY" value="30" />
<!-- 日志输出格式 -->
<!-- 控制台输出 --> <!-- INFO日志Appender -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder> <encoder>
<pattern>${console.log.pattern}</pattern> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder> </encoder>
</appender> </appender>
<include resource="logback-common.xml" /> <!-- ERROR日志Appender -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.${log.file}.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.${log.file}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<include resource="logback-logstash.xml" /> <!-- 根Logger配置禁用控制台输出 -->
<root level="INFO">
<!-- 开启 skywalking 日志收集 --> <appender-ref ref="FILE_INFO" />
<include resource="logback-skylog.xml" /> <appender-ref ref="FILE_ERROR" />
<!--系统操作日志-->
<root level="info">
<appender-ref ref="console" />
</root> </root>
</configuration> </configuration>