commit 20b6b78701f689e55a66b2e61dcfc46ebe410114 Author: zhaoyiran Date: Tue Mar 26 11:05:02 2024 +0800 初始化 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3af74be --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ +/logs diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..234cd01 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +## AdoptOpenJDK 停止发布 OpenJDK 二进制,而 Eclipse Temurin 是它的延伸,提供更好的稳定性 +## 感谢复旦核博士的建议!灰子哥,牛皮! +FROM eclipse-temurin:17-jre-alpine + +## 创建目录,并使用它作为工作目录 +RUN mkdir -p /opt/win-server +WORKDIR /opt/win-server +## 将后端项目的 Jar 文件,复制到镜像中 +COPY ./target/qad.jar qad.jar + +## 设置 TZ 时区 +ENV TZ=Asia/Shanghai +## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖 +ENV JAVA_OPTS="" + +## 应用参数 +ENV ARGS="" + +## 暴露后端项目的 25110 端口 +EXPOSE 23300 + +## 启动后端项目 +CMD java ${JAVA_OPTS} -jar qad.jar $ARGS diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..b4ae482 --- /dev/null +++ b/pom.xml @@ -0,0 +1,100 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.15 + + + com.win + qad + 1.0.0 + mq + win mq + + 17 + + + + + com.jcraft + jsch + 0.1.55 + + + + org.apache.commons + commons-lang3 + 3.9 + + + + org.apache.commons + commons-exec + 1.3 + + + + com.alibaba + fastjson + 1.2.83 + + + + org.projectlombok + lombok + 1.18.28 + + + + com.alibaba + druid-spring-boot-starter + 1.2.19 + + + + com.baomidou + mybatis-plus-boot-starter + 3.5.3.2 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-starter-web + + + + + + + ${project.artifactId} + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + diff --git a/src/main/java/com/win/qad/Application.java b/src/main/java/com/win/qad/Application.java new file mode 100644 index 0000000..fb30f3f --- /dev/null +++ b/src/main/java/com/win/qad/Application.java @@ -0,0 +1,18 @@ +package com.win.qad; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; + +/** + * 启动程序 + * + * @author win + */ +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + System.out.println("闻音启动成功"); + } +} diff --git a/src/main/java/com/win/qad/common/CommonResult.java b/src/main/java/com/win/qad/common/CommonResult.java new file mode 100644 index 0000000..467dd12 --- /dev/null +++ b/src/main/java/com/win/qad/common/CommonResult.java @@ -0,0 +1,112 @@ +package com.win.qad.common; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.win.qad.exception.ErrorCode; +import com.win.qad.exception.GlobalErrorCodeConstants; +import com.win.qad.exception.ServiceException; +import lombok.Data; +import org.springframework.util.Assert; + +import java.io.Serializable; +import java.util.Objects; + +/** + * 通用返回 + * + * @param 数据泛型 + */ +@Data +public class CommonResult implements Serializable { + + /** + * 错误码 + * + * @see ErrorCode#getCode() + */ + private Integer code; + /** + * 返回数据 + */ + private T data; + /** + * 错误提示,用户可阅读 + * + * @see ErrorCode#getMsg() () + */ + private String msg; + + /** + * 将传入的 result 对象,转换成另外一个泛型结果的对象 + * + * 因为 A 方法返回的 CommonResult 对象,不满足调用其的 B 方法的返回,所以需要进行转换。 + * + * @param result 传入的 result 对象 + * @param 返回的泛型 + * @return 新的 CommonResult 对象 + */ + public static CommonResult error(CommonResult result) { + return error(result.getCode(), result.getMsg()); + } + + public static CommonResult error(Integer code, String message) { + Assert.isTrue(!GlobalErrorCodeConstants.SUCCESS.getCode().equals(code), "code 必须是错误的!"); + CommonResult result = new CommonResult<>(); + result.code = code; + result.msg = message; + return result; + } + + public static CommonResult error(ErrorCode errorCode) { + return error(errorCode.getCode(), errorCode.getMsg()); + } + + public static CommonResult success(T data) { + CommonResult result = new CommonResult<>(); + result.code = GlobalErrorCodeConstants.SUCCESS.getCode(); + result.data = data; + result.msg = ""; + return result; + } + + public static boolean isSuccess(Integer code) { + return Objects.equals(code, GlobalErrorCodeConstants.SUCCESS.getCode()); + } + + @JsonIgnore // 避免 jackson 序列化 + public boolean isSuccess() { + return isSuccess(code); + } + + @JsonIgnore // 避免 jackson 序列化 + public boolean isError() { + return !isSuccess(); + } + + // ========= 和 Exception 异常体系集成 ========= + + /** + * 判断是否有异常。如果有,则抛出 {@link ServiceException} 异常 + */ + public void checkError() throws ServiceException { + if (isSuccess()) { + return; + } + // 业务异常 + throw new ServiceException(code, msg); + } + + /** + * 判断是否有异常。如果有,则抛出 {@link ServiceException} 异常 + * 如果没有,则返回 {@link #data} 数据 + */ + @JsonIgnore // 避免 jackson 序列化 + public T getCheckedData() { + checkError(); + return data; + } + + public static CommonResult error(ServiceException serviceException) { + return error(serviceException.getCode(), serviceException.getMessage()); + } + +} diff --git a/src/main/java/com/win/qad/config/RestTemplateConfig.java b/src/main/java/com/win/qad/config/RestTemplateConfig.java new file mode 100644 index 0000000..5b0d3f4 --- /dev/null +++ b/src/main/java/com/win/qad/config/RestTemplateConfig.java @@ -0,0 +1,31 @@ +package com.win.qad.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.web.client.RestTemplate; + +import java.nio.charset.StandardCharsets; + +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate(ClientHttpRequestFactory factory) { + RestTemplate restTemplate = new RestTemplate(factory); + // 支持中文编码 + restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); + return restTemplate; + } + + @Bean + public ClientHttpRequestFactory simpleClientHttpRequestFactory() { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setReadTimeout(5000);//单位为ms + factory.setConnectTimeout(5000);//单位为ms + return factory; + } + +} diff --git a/src/main/java/com/win/qad/exception/ErrorCode.java b/src/main/java/com/win/qad/exception/ErrorCode.java new file mode 100644 index 0000000..e9850f3 --- /dev/null +++ b/src/main/java/com/win/qad/exception/ErrorCode.java @@ -0,0 +1,26 @@ +package com.win.qad.exception; + +import lombok.Data; + +/** + * 错误码对象 + * TODO 错误码设计成对象的原因,为未来的 i18 国际化做准备 + */ +@Data +public class ErrorCode { + + /** + * 错误码 + */ + private final Integer code; + /** + * 错误提示 + */ + private final String msg; + + public ErrorCode(Integer code, String message) { + this.code = code; + this.msg = message; + } + +} diff --git a/src/main/java/com/win/qad/exception/GlobalErrorCodeConstants.java b/src/main/java/com/win/qad/exception/GlobalErrorCodeConstants.java new file mode 100644 index 0000000..2319aa8 --- /dev/null +++ b/src/main/java/com/win/qad/exception/GlobalErrorCodeConstants.java @@ -0,0 +1,45 @@ +package com.win.qad.exception; + +/** + * 全局错误码枚举 + * 0-999 系统异常编码保留 + * + * 一般情况下,使用 HTTP 响应状态码 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status + * 虽然说,HTTP 响应状态码作为业务使用表达能力偏弱,但是使用在系统层面还是非常不错的 + * 比较特殊的是,因为之前一直使用 0 作为成功,就不使用 200 啦。 + * + * @author 闻荫源码 + */ +public interface GlobalErrorCodeConstants { + + ErrorCode SUCCESS = new ErrorCode(0, "成功"); + + ErrorCode SIGN_ERROR = new ErrorCode(300, "签名不正确"); + ErrorCode TIMESTAMP_ERROR = new ErrorCode(301, "时间戳不正确"); + ErrorCode EXPIRE_ERROR = new ErrorCode(302, "请求已过期"); + ErrorCode INTERFACE_ERROR = new ErrorCode(303, "接口不正确"); + ErrorCode CONFIG_ERROR = new ErrorCode(304, "请先维护推送设置"); + ErrorCode SEND_ERROR = new ErrorCode(305, "发送消息失败"); + // ========== 客户端错误段 ========== + + ErrorCode BAD_REQUEST = new ErrorCode(400, "请求参数不正确"); + ErrorCode UNAUTHORIZED = new ErrorCode(401, "账号未登录"); + ErrorCode FORBIDDEN = new ErrorCode(403, "没有该操作权限"); + ErrorCode NOT_FOUND = new ErrorCode(404, "请求未找到"); + ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确"); + ErrorCode LOCKED = new ErrorCode(423, "请求失败,请稍后重试"); // 并发请求,不允许 + ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁,请稍后重试"); + + // ========== 服务端错误段 ========== + + ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常"); + ErrorCode NOT_IMPLEMENTED = new ErrorCode(501, "功能未实现/未开启"); + ErrorCode EXECUTE_FAIL = new ErrorCode(502, "执行失败"); + + // ========== 自定义错误段 ========== + ErrorCode REPEATED_REQUESTS = new ErrorCode(900, "重复请求,请稍后重试"); // 重复请求 + ErrorCode DEMO_DENY = new ErrorCode(901, "演示模式,禁止写操作"); + + ErrorCode UNKNOWN = new ErrorCode(999, "未知错误"); + +} diff --git a/src/main/java/com/win/qad/exception/ServerException.java b/src/main/java/com/win/qad/exception/ServerException.java new file mode 100644 index 0000000..7c13ceb --- /dev/null +++ b/src/main/java/com/win/qad/exception/ServerException.java @@ -0,0 +1,58 @@ +package com.win.qad.exception; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 服务器异常 Exception + */ +@Data +@EqualsAndHashCode(callSuper = true) +public final class ServerException extends RuntimeException { + + /** + * 全局错误码 + * + */ + private Integer code; + /** + * 错误提示 + */ + private String message; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServerException() { + } + + public ServerException(ErrorCode errorCode) { + this.code = errorCode.getCode(); + this.message = errorCode.getMsg(); + } + + public ServerException(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public ServerException setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + return message; + } + + public ServerException setMessage(String message) { + this.message = message; + return this; + } + +} diff --git a/src/main/java/com/win/qad/exception/ServiceException.java b/src/main/java/com/win/qad/exception/ServiceException.java new file mode 100644 index 0000000..ab53a57 --- /dev/null +++ b/src/main/java/com/win/qad/exception/ServiceException.java @@ -0,0 +1,58 @@ +package com.win.qad.exception; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 业务逻辑异常 Exception + */ +@Data +@EqualsAndHashCode(callSuper = true) +public final class ServiceException extends RuntimeException { + + /** + * 业务错误码 + * + */ + private Integer code; + /** + * 错误提示 + */ + private String message; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServiceException() { + } + + public ServiceException(ErrorCode errorCode) { + this.code = errorCode.getCode(); + this.message = errorCode.getMsg(); + } + + public ServiceException(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public ServiceException setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + return message; + } + + public ServiceException setMessage(String message) { + this.message = message; + return this; + } + +} diff --git a/src/main/java/com/win/qad/handler/GlobalExceptionHandler.java b/src/main/java/com/win/qad/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..7c469a5 --- /dev/null +++ b/src/main/java/com/win/qad/handler/GlobalExceptionHandler.java @@ -0,0 +1,63 @@ +package com.win.qad.handler; + +import com.win.qad.common.CommonResult; +import com.win.qad.exception.ServiceException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.servlet.http.HttpServletRequest; + +import static com.win.qad.exception.GlobalErrorCodeConstants.INTERFACE_ERROR; +import static com.win.qad.exception.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; + +/** + * 全局异常处理器,将 Exception 翻译成 CommonResult + 对应的异常编号 + * + * @author 闻荫源码 + */ +@Slf4j +@RestControllerAdvice +public class GlobalExceptionHandler { + + /** + * 接口未找到业务异常 NoSuchMethodException + */ + @ExceptionHandler(NoSuchMethodException.class) + public CommonResult noSuchMethodExceptionHandler(NoSuchMethodException e) { + log.error("[serviceExceptionHandler]", e); + return CommonResult.error(INTERFACE_ERROR.getCode(), INTERFACE_ERROR.getMsg()); + } + + /** + * 处理业务异常 ServiceException + * + * 例如说,商品库存不足,用户手机号已存在。 + */ + @ExceptionHandler(ServiceException.class) + public CommonResult serviceExceptionHandler(ServiceException ex, HttpServletRequest request) { + log.error("[serviceExceptionHandler]", ex); + return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg()); + } + + /** + * 处理业务异常 ServiceException + * + * 例如说,商品库存不足,用户手机号已存在。 + */ + @ExceptionHandler(RuntimeException.class) + public CommonResult runtimeExceptionHandler(ServiceException ex, HttpServletRequest request) { + log.error("[runtimeExceptionHandler]", ex); + return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg()); + } + + /** + * 处理系统异常,兜底处理所有的一切 + */ + @ExceptionHandler(Exception.class) + public CommonResult defaultExceptionHandler(Throwable ex, HttpServletRequest request) { + log.error("[defaultExceptionHandler]", ex); + return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg()); + } + +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..c2fbfa8 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,58 @@ +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 18080 + servlet: + # 应用的访问路径 + context-path: / + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # 连接数满后的排队数,默认为100 + accept-count: 100 + threads: + # tomcat最大线程数,默认为200 + max: 100 + # Tomcat启动初始化的线程数,默认值10 + min-spare: 10 + +spring: + autoconfigure: + exclude: + - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://dev.ccwin-in.com:23113/qad_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: learun + password: Microdoft@2021 + +# 日志配置 +logging: + file: + path: logs + level: + com.win: debug + org.springframework: warn + +shell: + jlht: + qad-domain: JLHT + company-code: CCWININ + server-id: master + ip: 222.169.228.163 + port: 6122 + linux-id: mfg + linux-password: mfgpro + qad-user: mfg + qad-password: Qadwin1 + jlht2: + qad-domain: JLHT2 + company-code: CCWININ + server-id: master + ip: 222.169.228.163 + port: 6122 + linux-id: mfg + linux-password: mfgpro + qad-user: mfg + qad-password: Qadwin1 diff --git a/src/main/resources/application-druid.yml b/src/main/resources/application-druid.yml new file mode 100644 index 0000000..d6479cc --- /dev/null +++ b/src/main/resources/application-druid.yml @@ -0,0 +1,47 @@ +# 数据源配置 +spring: + datasource: + druid: + # 初始连接数 + initialSize: 20 + # 最小连接池数量 + minIdle: 20 + # 最大连接池数量 + maxActive: 200 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: false + url-pattern: /* # 过滤所有url + exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" # 排除一些不必要的url + session-stat-enable: true # 开启session统计功能 + session-stat-max-count: 1000 # session的最大个数,默认100 + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: win + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true \ No newline at end of file diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml new file mode 100644 index 0000000..b31f524 --- /dev/null +++ b/src/main/resources/application-prod.yml @@ -0,0 +1,47 @@ +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 23300 + servlet: + # 应用的访问路径 + context-path: / + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # 连接数满后的排队数,默认为100 + accept-count: 100 + threads: + # tomcat最大线程数,默认为200 + max: 100 + # Tomcat启动初始化的线程数,默认值10 + min-spare: 10 + +# 日志配置 +logging: + file: + path: logs + level: + com.win: debug + org.springframework: warn + +shell: + jlht: + qad-domain: JLHT + company-code: CCWININ + server-id: master + ip: 222.169.228.163 + port: 6122 + linux-id: mfg + linux-password: mfgpro + qad-user: mfg + qad-password: Qadwin1 + jlht2: + qad-domain: JLHT2 + company-code: CCWININ + server-id: master + ip: 222.169.228.163 + port: 6122 + linux-id: mfg + linux-password: mfgpro + qad-user: mfg + qad-password: Qadwin1 diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml new file mode 100644 index 0000000..b31f524 --- /dev/null +++ b/src/main/resources/application-test.yml @@ -0,0 +1,47 @@ +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 23300 + servlet: + # 应用的访问路径 + context-path: / + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # 连接数满后的排队数,默认为100 + accept-count: 100 + threads: + # tomcat最大线程数,默认为200 + max: 100 + # Tomcat启动初始化的线程数,默认值10 + min-spare: 10 + +# 日志配置 +logging: + file: + path: logs + level: + com.win: debug + org.springframework: warn + +shell: + jlht: + qad-domain: JLHT + company-code: CCWININ + server-id: master + ip: 222.169.228.163 + port: 6122 + linux-id: mfg + linux-password: mfgpro + qad-user: mfg + qad-password: Qadwin1 + jlht2: + qad-domain: JLHT2 + company-code: CCWININ + server-id: master + ip: 222.169.228.163 + port: 6122 + linux-id: mfg + linux-password: mfgpro + qad-user: mfg + qad-password: Qadwin1 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..6c3ef23 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,33 @@ +spring: + application: + name: win + profiles: + include: druid + active: dev + main: + allow-bean-definition-overriding: true + servlet: + multipart: + enabled: true + max-file-size: 200MB + max-request-size: 1000MB + +# MyBatis Plus 的配置项 +mybatis-plus: + configuration: + map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 + logImpl: org.apache.ibatis.logging.slf4j.Slf4jImpl + # 开启缓存 + cache-enabled: true + global-config: + db-config: + id-type: NONE # “智能”模式,基于 IdTypeEnvironmentPostProcessor + 数据源的类型,自动适配成 AUTO、INPUT 模式。 + logic-delete-value: 1 # 逻辑已删除值(默认为 1) + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) + banner: false # 关闭控制台的 Banner 打印 + type-aliases-package: com.win.dao + encryptor: + password: XDV71a+xqStEA3WH # 加解密的秘钥,可使用 https://www.imaegoo.com/2020/aes-key-generator/ 网站生成 + +mybatis-plus-join: + banner: false # 关闭控制台的 Banner 打印 diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c191ed4 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + debug + + + ${CONSOLE_LOG_PATTERN} + + UTF-8 + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file