diff --git a/iot-gateway/src/main/resources/bootstrap-dev.yml b/iot-gateway/src/main/resources/bootstrap-dev.yml index 415f73a..9f85ffa 100644 --- a/iot-gateway/src/main/resources/bootstrap-dev.yml +++ b/iot-gateway/src/main/resources/bootstrap-dev.yml @@ -75,6 +75,7 @@ security: - /iot-websocket/websocket/customer - /iot-websocket/websocket/tts/token - /iot-websocket/websocket/init/sysTalkAnswer + - /iot-websocket/websocket/device/init #application: # cors: # allowed-crigin-patterns: diff --git a/iot-gateway/src/main/resources/bootstrap.yml b/iot-gateway/src/main/resources/bootstrap.yml index ec17f21..e0b0a0e 100644 --- a/iot-gateway/src/main/resources/bootstrap.yml +++ b/iot-gateway/src/main/resources/bootstrap.yml @@ -1,5 +1,5 @@ server: - port: 8080 + port: 8081 spring: application: name: qiuguo-iot-gateway diff --git a/iot-modules/iot-box-user-api/pom.xml b/iot-modules/iot-box-user-api/pom.xml index f970f07..51ae33a 100644 --- a/iot-modules/iot-box-user-api/pom.xml +++ b/iot-modules/iot-box-user-api/pom.xml @@ -70,18 +70,8 @@ reactor-test test - - org.apache.skywalking - apm-toolkit-logback-1.x - - - ch.qos.logback - logback-classic - - - 8.15.0 - - + + cn.hutool @@ -90,6 +80,13 @@ + + org.apache.skywalking + apm-toolkit-logback-1.x + + 9.0.0 + + org.apache.skywalking apm-toolkit-trace @@ -102,6 +99,8 @@ 9.0.0 + + ${project.artifactId} diff --git a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/device/DeviceController.java b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/device/DeviceController.java index 4ecacfb..746e58f 100644 --- a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/device/DeviceController.java +++ b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/device/DeviceController.java @@ -1,10 +1,12 @@ package com.qiuguo.iot.user.api.controller.device; +import cn.hutool.crypto.digest.MD5; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.qiuguo.iot.base.constans.Log4Constans; import com.qiuguo.iot.base.constans.RedisConstans; import com.qiuguo.iot.base.enums.*; +import com.qiuguo.iot.base.utils.DateTimeUtils; import com.qiuguo.iot.base.utils.StringUtils; import com.qiuguo.iot.data.domain.BaseMessageResp; import com.qiuguo.iot.data.domain.BaseSession; @@ -12,12 +14,15 @@ import com.qiuguo.iot.data.domain.IActionSendMessage; import com.qiuguo.iot.data.domain.action.Action; import com.qiuguo.iot.data.domain.box.BoxSession; import com.qiuguo.iot.data.domain.user.UserSession; +import com.qiuguo.iot.data.entity.device.DeviceInfoEntity; import com.qiuguo.iot.data.entity.device.DeviceUserBindEntity; import com.qiuguo.iot.data.entity.device.DeviceUserTalkRecordEntity; import com.qiuguo.iot.data.model.system.SystemTalkAnswerConfig; +import com.qiuguo.iot.data.request.device.DeviceInfoRequest; import com.qiuguo.iot.data.request.device.DeviceUserBindRequest; import com.qiuguo.iot.data.request.device.DeviceUserTalkRecordRequest; import com.qiuguo.iot.data.request.qiuguo.cloud.UserTalkRequst; +import com.qiuguo.iot.data.resp.device.DeviceInitResp; import com.qiuguo.iot.data.resp.device.DeviceTalkRecordResp; import com.qiuguo.iot.data.resp.device.DeviceUserBindResp; import com.qiuguo.iot.data.service.device.DeviceBatchService; @@ -42,12 +47,14 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; +import org.springframework.data.redis.core.ReactiveValueOperations; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Mono; import lombok.extern.slf4j.Slf4j; import org.hswebframework.web.api.crud.entity.PagerResult; import javax.annotation.Resource; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; @@ -77,6 +84,92 @@ public class DeviceController { @Resource private SystemTalkAnswerConfigService systemTalkAnswerConfigService; + @Value("${device.key}") + private String key; + @Value("${device.checkTimeout}") + private Boolean checkTimeout; + @Autowired + private DeviceInfoService deviceInfoService; + + + @Resource + private ReactiveStringRedisTemplate reactiveStringRedisTemplate; + + @Value("${device.timeout}") + private Long timeOut;//2分钟 + @GetMapping("/init") + public Mono deviceInit(@RequestParam String wifiMac, @RequestParam String btMac, + @RequestParam Integer type, @RequestParam Long time, + @RequestParam String signature){ + //deviceInfoService. + Long now = System.currentTimeMillis(); + if(checkTimeout && now - time > timeOut){ + //超时 + log.info("请求过期"); + BusinessException ex = new BusinessException("请求已失效"); + return Mono.error(ex); + } + //设备类型是否匹配暂时不做限制 + DeviceTypeEnum entryTypeEnum = DeviceTypeEnum.getEnumWithCode(type); + if(entryTypeEnum == null){ + log.info("不支持的设备类型"); + BusinessException ex = new BusinessException("不支持的设备类型"); + return Mono.error(ex); + } + //验签 + String wifiMd5 = MD5.create().digestHex(wifiMac).toUpperCase(); + String btMd5 = MD5.create().digestHex(btMac).toUpperCase(); + String typeMd5 = MD5.create().digestHex(type.toString()).toUpperCase(); + String md5 = MD5.create().digestHex(wifiMd5 + btMd5 + typeMd5 + time + key).toUpperCase(); + if (!md5.equals(signature)) { + // + //验签失败 + log.info("验签失败:{}", md5); + BusinessException ex = new BusinessException("验签失败"); + return Mono.error(ex); + } + + DeviceInfoRequest request = new DeviceInfoRequest(); + request.setWifiMac(wifiMac); + request.setBtMac(btMac); + Mono mono = deviceInfoService.selectDeviceInfoByRequest(request); + + return mono.defaultIfEmpty(new DeviceInfoEntity()).flatMap(entity -> { + Mono mono1 = null; + if(entity.getId() == null){ + entity.setWifiMac(wifiMac); + entity.setBtMac(btMac); + entity.setBatchId(1l); + entity.setName(entryTypeEnum.getName()); + entity.setDeviceType(type); + entity.setKey( StringUtils.getRandomStr(10));//生成key + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyMMddHHmmss"); + entity.setSn("QG" + entryTypeEnum.getSn() +df.format(DateTimeUtils.getNowLocalDateTime()) + StringUtils.getRandomStr(3)); + mono1 = deviceInfoService.insertDeviceInfo(entity); + }else{ + entity.setKey( StringUtils.getRandomStr(10));//重新生成Key + mono1 = deviceInfoService.updateDeviceInfoById(entity); + + + } + return mono1.map(m ->{ + return entity; + }); + }).map(o -> { + DeviceInfoEntity deviceInfoEntity = (DeviceInfoEntity)o; + ReactiveValueOperations operations = reactiveStringRedisTemplate.opsForValue(); + operations.set(RedisConstans.DEVICE_INFO + deviceInfoEntity.getSn() + , JSONObject.toJSONString(deviceInfoEntity) + , RedisConstans.ONE_HOUR).subscribe(); + DeviceInitResp resp = new DeviceInitResp(); + resp.setKey(deviceInfoEntity.getKey()); + resp.setSn(deviceInfoEntity.getSn()); + return resp; + }); + + + } + @GetMapping("/init/sysTalkAnswer") public Mono sysTalkAnswer(@RequestParam Integer type) { diff --git a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogWebFilter.java b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogWebFilter.java index fca780e..41b2ab0 100644 --- a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogWebFilter.java +++ b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogWebFilter.java @@ -89,9 +89,9 @@ public class LogWebFilter implements WebFilter { }).doFinally(signalType -> { WebFluxSkyWalkingOperators.continueTracing(newEx, () -> { long endTime = System.currentTimeMillis(); - MDC.put(Log4Constans.PRINT_LOG_ID, tracId); + //MDC.put(Log4Constans.PRINT_LOG_ID, tracId); log.info("api end time:{}, total time:{}", endTime, endTime - startTime); - MDC.remove(Log4Constans.PRINT_LOG_ID); + //MDC.remove(Log4Constans.PRINT_LOG_ID); }); }); diff --git a/iot-modules/iot-box-user-api/src/main/resources/bootstrap.yml b/iot-modules/iot-box-user-api/src/main/resources/bootstrap.yml index 303ef87..051aa77 100644 --- a/iot-modules/iot-box-user-api/src/main/resources/bootstrap.yml +++ b/iot-modules/iot-box-user-api/src/main/resources/bootstrap.yml @@ -1,5 +1,5 @@ server: - port: 8080 + port: 8082 spring: application: name: qiuguo-iot-box-user-api \ No newline at end of file diff --git a/iot-modules/iot-box-websocket-api/pom.xml b/iot-modules/iot-box-websocket-api/pom.xml index a2b29cd..7656d6d 100644 --- a/iot-modules/iot-box-websocket-api/pom.xml +++ b/iot-modules/iot-box-websocket-api/pom.xml @@ -18,12 +18,6 @@ org.springframework.boot spring-boot-starter-webflux - - - ch.qos.logback - logback-classic - - @@ -95,6 +89,12 @@ + + org.apache.skywalking + apm-toolkit-logback-1.x + + 9.0.0 + org.apache.skywalking apm-toolkit-trace diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/controller/DeviceController.java b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/controller/DeviceController.java index 86fa6d2..c959324 100644 --- a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/controller/DeviceController.java +++ b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/controller/DeviceController.java @@ -85,7 +85,7 @@ public class DeviceController { if (!md5.equals(signature)) { // //验签失败 - log.info("验签失败"); + log.info("验签失败:{}", md5); BusinessException ex = new BusinessException("验签失败"); return Mono.error(ex); } diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/filter/LogMdcConfiguration.java b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/filter/LogMdcConfiguration.java index b7e2e46..e55c141 100644 --- a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/filter/LogMdcConfiguration.java +++ b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/filter/LogMdcConfiguration.java @@ -72,7 +72,9 @@ public class LogMdcConfiguration { if(coreSubscriber.currentContext().hasKey(Log4Constans.PRINT_LOG_ID)){ MDC.put(Log4Constans.PRINT_LOG_ID, coreSubscriber.currentContext().get(Log4Constans.PRINT_LOG_ID)); } + //log.info("sky-------->"); WebFluxSkyWalkingOperators.continueTracing(ctx, () ->{ + //log.info("walking=======>"); coreSubscriber.onNext(t); }); } diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/filter/LogWebFilter.java b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/filter/LogWebFilter.java index a9e4ce0..d292f69 100644 --- a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/filter/LogWebFilter.java +++ b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/filter/LogWebFilter.java @@ -1,7 +1,10 @@ package com.qiuguo.iot.box.websocket.api.filter; import com.qiuguo.iot.base.constans.Log4Constans; +import com.qiuguo.iot.base.utils.StringUtils; import lombok.extern.slf4j.Slf4j; +import org.apache.skywalking.apm.toolkit.webflux.WebFluxSkyWalkingOperators; +import org.apache.skywalking.apm.toolkit.webflux.WebFluxSkyWalkingTraceContext; import org.hswebframework.web.logger.ReactiveLogger; import org.reactivestreams.Publisher; import org.slf4j.MDC; @@ -37,16 +40,18 @@ import java.util.Arrays; @Configuration @Slf4j public class LogWebFilter implements WebFilter { - public static String HEAD_IP = "customerIP"; @Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { long startTime = System.currentTimeMillis(); ServerHttpRequest request = exchange.getRequest(); - String requestId = request.getId(); + String requestId = request.getId();//WebFluxSkyWalkingTraceContext.segmentId(exchange); + log.info("获取到的traceId:{}", requestId); + //String pid = WebFluxSkyWalkingTraceContext.getCorrelation(exchange, Log4Constans.PRINT_LOG_ID).get(); + //log.info("获取到的pid:{}", pid); String ip = request.getRemoteAddress().getAddress().getHostAddress(); - if(request.getHeaders().containsKey(Log4Constans.PRINT_LOG_ID)){ + if(request.getHeaders().containsKey(Log4Constans.HEADER_TRACE_ID)){ //网关生成的tracId - requestId = request.getHeaders().get(Log4Constans.PRINT_LOG_ID).get(0); + requestId = request.getHeaders().get(Log4Constans.HEADER_TRACE_ID).get(0); } if(request.getHeaders().containsKey(Log4Constans.CUSTOMER_IP)){ @@ -74,17 +79,20 @@ public class LogWebFilter implements WebFilter { // if(!request.getMethod().equals(HttpMethod.GET) && !request.getMethod().equals(HttpMethod.DELETE)){ ex.request(getRequest(exchange, ip, requestId)); String tracId = requestId; - return chain.filter(ex.build()) + ServerWebExchange newEx = ex.build(); + return chain.filter(newEx) .contextWrite(context -> { Context contextTmp = context.put(Log4Constans.PRINT_LOG_ID, tracId); return contextTmp; }) .doFinally(signalType -> { - long endTime = System.currentTimeMillis(); - MDC.put(Log4Constans.PRINT_LOG_ID, tracId); - log.info("api end time:{}, total time:{}", endTime, endTime - startTime); - MDC.remove(Log4Constans.PRINT_LOG_ID); + WebFluxSkyWalkingOperators.continueTracing(newEx, () -> { + long endTime = System.currentTimeMillis(); + //MDC.put(Log4Constans.PRINT_LOG_ID, tracId); + log.info("api end time:{}, total time:{}", endTime, endTime - startTime); + //MDC.remove(Log4Constans.PRINT_LOG_ID); + }); }); } @@ -95,18 +103,19 @@ public class LogWebFilter implements WebFilter { public Flux getBody() { Flux body = this.getDelegate().getBody(); return body.map(dataBuffer -> { - log.info("request:{}", dataBuffer.toString(StandardCharsets.UTF_8)); + if (/*!request.getMethod().equals(HttpMethod.GET) && */!request.getMethod().equals(HttpMethod.DELETE)) { + log.info("request:{}", dataBuffer.toString(StandardCharsets.UTF_8)); + } return dataBuffer; }); } - @Override + /* @Override public HttpHeaders getHeaders(){ HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.putAll(super.getHeaders()); - httpHeaders.set(HEAD_IP, customerIp); - httpHeaders.set(Log4Constans.PRINT_LOG_ID, requestId); + httpHeaders.set(Log4Constans.HEADER_TRACE_ID, requestId); return httpHeaders; - } + }*/ }; return newRequest; } diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/BoxWebSocketHandler.java b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/BoxWebSocketHandler.java index a5389ff..ec7ce9f 100644 --- a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/BoxWebSocketHandler.java +++ b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/BoxWebSocketHandler.java @@ -30,6 +30,8 @@ import com.qiuguo.iot.data.service.device.DeviceUserBindService; import com.qiuguo.iot.data.domain.action.Actions; import com.qiuguo.iot.third.service.NlpService; import lombok.extern.slf4j.Slf4j; +import org.apache.skywalking.apm.toolkit.trace.Trace; +import org.apache.skywalking.apm.toolkit.webflux.WebFluxSkyWalkingOperators; import org.slf4j.MDC; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.http.HttpHeaders; @@ -87,7 +89,7 @@ public class BoxWebSocketHandler implements WebSocketHandler { log.info("设备{},请求数据已超时", sn); return session.close(); } - String ip = headers.get(LogWebFilter.HEAD_IP).get(0); + String ip = headers.get(Log4Constans.CUSTOMER_IP).get(0); if(ip.startsWith("192.") || ip.startsWith("10.") || ip.startsWith("172.") || @@ -107,32 +109,41 @@ public class BoxWebSocketHandler implements WebSocketHandler { boxSession.setUserId(userId); boxSession.setRobotId(userId); - boxSession.setBaseLogId(headers.get(Log4Constans.PRINT_LOG_ID).get(0)); + boxSession.setBaseLogId(headers.get(Log4Constans.HEADER_TRACE_ID).get(0)); boxSession.setLogId(boxSession.getBaseLogId()); log.info("登录成功SN:{}", sn); Mono input = session.receive().map(webSocketMessage ->{ - newMessage(webSocketMessage, boxSession).contextWrite(context -> { - log.info("新的消息"); - Context contextTmp = context.put(Log4Constans.PRINT_LOG_ID, boxSession.getLogId()); + newMessage(webSocketMessage, boxSession).contextWrite(context -> { + + log.info("新的消息"); + Context contextTmp = context.put(Log4Constans.PRINT_LOG_ID, boxSession.getLogId()); + + return contextTmp; + }).subscribe(); - return contextTmp; - }).subscribe(); return webSocketMessage; + }).contextWrite(context -> { + Context contextTmp = context.put(Log4Constans.PRINT_LOG_ID, boxSession.getLogId()); + + return contextTmp; }).then(); //校验 - checkToken(boxSession, linkTime, signature, isBind).contextWrite(context -> { + checkToken(boxSession, linkTime, signature, isBind) + .subscribe(); + + Mono output = session.send(Flux.create(sink -> boxSession.setSink(sink))).contextWrite(context -> { + + Context contextTmp = context.put(Log4Constans.PRINT_LOG_ID, boxSession.getLogId()); return contextTmp; - }).subscribe(); - - Mono output = session.send(Flux.create(sink -> boxSession.setSink(sink))).then(); + }).then(); // Mono.zip() 会将多个 Mono 合并为一个新的 Mono,任何一个 Mono 产生 error 或 complete 都会导致合并后的 Mono // 也随之产生 error 或 complete,此时其它的 Mono 则会被执行取消操作。 @@ -144,6 +155,12 @@ public class BoxWebSocketHandler implements WebSocketHandler { return contextTmp; }).subscribe(); + }).contextWrite(context -> { + + + Context contextTmp = context.put(Log4Constans.PRINT_LOG_ID, boxSession.getLogId()); + + return contextTmp; }).then(); } diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/CustomerWebSocketHandler.java b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/CustomerWebSocketHandler.java index 223eef1..a1d0524 100644 --- a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/CustomerWebSocketHandler.java +++ b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/CustomerWebSocketHandler.java @@ -74,7 +74,7 @@ public class CustomerWebSocketHandler implements WebSocketHandler { log.info("用户{},请求数据已超时", userId); return session.close(); } - String ip = headers.get(LogWebFilter.HEAD_IP).get(0); + String ip = headers.get(Log4Constans.CUSTOMER_IP).get(0); UserSession userSession = new UserSession(); userSession.setUserId(userId); userSession.setSession(session); @@ -82,7 +82,7 @@ public class CustomerWebSocketHandler implements WebSocketHandler { userSession.setRobotId(userId); userSession.setSessionType(YesNo.YES.getCode()); - userSession.setBaseLogId(headers.get(Log4Constans.PRINT_LOG_ID).get(0)); + userSession.setBaseLogId(headers.get(Log4Constans.HEADER_TRACE_ID).get(0)); userSession.setLogId(userSession.getBaseLogId()); log.info("用户成功userId:{}", userId); Mono input = session.receive().map(webSocketMessage ->{ diff --git a/iot-modules/iot-box-websocket-api/src/main/resources/bootstrap-dev.yml b/iot-modules/iot-box-websocket-api/src/main/resources/bootstrap-dev.yml index 7d41d24..845c1d5 100644 --- a/iot-modules/iot-box-websocket-api/src/main/resources/bootstrap-dev.yml +++ b/iot-modules/iot-box-websocket-api/src/main/resources/bootstrap-dev.yml @@ -24,6 +24,46 @@ spring: # 共享配置 shared-configs: - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + r2dbc: + #注意下面修改 easyorm相关也需要修改 + #url: r2dbc:postgresql://localhost:5432/postgres #postgresql请使用此配置 + url: r2dbc:mysql://192.168.8.146:30416/qiuguo_iot?ssl=false&serverZoneId=Asia/Shanghai # mysql请使用此配置 + #url: r2dbc:h2:file:///./data/h2db/jetlinks + username: root + password: 123456 + redis: + # cluster: + # nodes: + # - 127.0.0.1:7001 + # - 127.0.0.1:7002 + host: 192.168.8.146 + port: 32030 + password: 123456 + timeout: 5000 + rabbitmq: + host: 192.168.8.146 + port: 31043 + username: admin + password: 123456 + listener: + simple: + # 设置手动ack回复 + acknowledge-mode: manual + retry: + # 开启重试机制 + enabled: true + # 重试次数 + max-attempts: 3 + # 重试最大间隔时间 + max-interval: 100000 + # 重试初始间隔时间 + initial-interval: 100 + # 间隔时间因子 + multiplier: 20 + #设置消息发送回调 + publisher-returns: true + publisher-confirm-type: simple + virtual-host: /iot tianqiapi: url: https://v0.yiketianqi.com/api?unescape=1&version=v91&appid=23293151&appsecret=Lj6ZMcqn&ext=life qiuguo: diff --git a/iot-modules/iot-box-websocket-api/src/main/resources/logback-spring.xml b/iot-modules/iot-box-websocket-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c5702be --- /dev/null +++ b/iot-modules/iot-box-websocket-api/src/main/resources/logback-spring.xml @@ -0,0 +1,82 @@ + + + ${HOSTNAME} + + + + + + + + + + + ${LOG_PATH}/application.${HOSTNAME}.log + + ${PATTERN} + + + ${LOG_PATH}/application.%d{yyyy-MM-dd}.${HOSTNAME}.log + + 30 + + + + + ${LOG_PATH}/sql.${HOSTNAME}.log + + ${PATTERN} + + + ${LOG_PATH}/sql.%d{yyyy-MM-dd}.${HOSTNAME}.log + + 3 + + + + + + + ${PATTERN} + + + + + + + + + ${SKY_PATTERN} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +