
21 changed files with 688 additions and 12 deletions
@ -0,0 +1,15 @@ |
|||||
|
package com.visual.open.anpr.server.bootstrap; |
||||
|
|
||||
|
import org.springframework.boot.SpringApplication; |
||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication; |
||||
|
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; |
||||
|
import org.springframework.scheduling.annotation.EnableScheduling; |
||||
|
|
||||
|
@SpringBootApplication |
||||
|
public class OpenAnprApplication { |
||||
|
|
||||
|
public static void main(String[] args) { |
||||
|
SpringApplication.run(OpenAnprApplication.class, args); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,39 @@ |
|||||
|
package com.visual.open.anpr.server.bootstrap.conf; |
||||
|
|
||||
|
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; |
||||
|
import org.springframework.beans.factory.annotation.Value; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import springfox.documentation.builders.ApiInfoBuilder; |
||||
|
import springfox.documentation.builders.PathSelectors; |
||||
|
import springfox.documentation.builders.RequestHandlerSelectors; |
||||
|
import springfox.documentation.oas.annotations.EnableOpenApi; |
||||
|
import springfox.documentation.spi.DocumentationType; |
||||
|
import springfox.documentation.spring.web.plugins.Docket; |
||||
|
|
||||
|
@Configuration |
||||
|
@EnableOpenApi |
||||
|
@EnableKnife4j |
||||
|
public class Knife4jConfig { |
||||
|
|
||||
|
@Value("${visual.swagger.enable:true}") |
||||
|
private Boolean enable; |
||||
|
|
||||
|
@Bean |
||||
|
public Docket createRestApi() { |
||||
|
return new Docket(DocumentationType.OAS_30) |
||||
|
.enable(enable) |
||||
|
.apiInfo(new ApiInfoBuilder() |
||||
|
.title("车牌识别服务API") |
||||
|
.description("车牌识别服务API") |
||||
|
.version("1.0.0") |
||||
|
.build()) |
||||
|
.groupName("1.0.0") |
||||
|
.select() |
||||
|
.apis(RequestHandlerSelectors.basePackage("com.visual.open.anpr.server.controller.server")) |
||||
|
.paths(PathSelectors.any()) |
||||
|
.build(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
@ -0,0 +1,96 @@ |
|||||
|
package com.visual.open.anpr.server.bootstrap.conf; |
||||
|
|
||||
|
import com.visual.open.anpr.core.base.PlateDetection; |
||||
|
import com.visual.open.anpr.core.base.PlateRecognition; |
||||
|
import com.visual.open.anpr.core.extract.PlateExtractor; |
||||
|
import com.visual.open.anpr.core.extract.PlateExtractorImpl; |
||||
|
import com.visual.open.anpr.core.models.TorchPlateDetection; |
||||
|
import com.visual.open.anpr.core.models.TorchPlateRecognition; |
||||
|
import org.springframework.beans.factory.annotation.Qualifier; |
||||
|
import org.springframework.beans.factory.annotation.Value; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
|
||||
|
@Configuration("visualModelConfig") |
||||
|
public class ModelConfig { |
||||
|
|
||||
|
@Value("${spring.profiles.active}") |
||||
|
private String profile; |
||||
|
|
||||
|
@Value("${visual.model.plateDetection.name:TorchPlateDetection}") |
||||
|
private String plateDetectionName; |
||||
|
@Value("${visual.model.plateDetection.modelPath}") |
||||
|
private String[] plateDetectionModel; |
||||
|
@Value("${visual.model.plateDetection.thread:4}") |
||||
|
private Integer plateDetectionThread; |
||||
|
|
||||
|
@Value("${visual.model.plateRecognition.name:TorchPlateRecognition}") |
||||
|
private String plateRecognitionName; |
||||
|
@Value("${visual.model.plateRecognition.modelPath}") |
||||
|
private String[] plateRecognitionNameModel; |
||||
|
@Value("${visual.model.plateRecognition.thread:4}") |
||||
|
private Integer plateRecognitionNameThread; |
||||
|
|
||||
|
/** |
||||
|
* 获取车牌检查模型 |
||||
|
* @return |
||||
|
*/ |
||||
|
@Bean(name = "visualPlateDetection") |
||||
|
public PlateDetection getPlateDetection(){ |
||||
|
if(plateDetectionName.equalsIgnoreCase("TorchPlateDetection")){ |
||||
|
return new TorchPlateDetection(getModelPath(plateDetectionName, plateDetectionModel)[0], plateDetectionThread); |
||||
|
}else{ |
||||
|
return new TorchPlateDetection(getModelPath(plateDetectionName, plateDetectionModel)[0], plateDetectionThread); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 人脸特征提取服务 |
||||
|
* @return |
||||
|
*/ |
||||
|
@Bean(name = "visualPlateRecognition") |
||||
|
public PlateRecognition getPlateRecognition(){ |
||||
|
if(plateRecognitionName.equalsIgnoreCase("TorchPlateRecognition")){ |
||||
|
return new TorchPlateRecognition(getModelPath(plateRecognitionName, plateRecognitionNameModel)[0], plateRecognitionNameThread); |
||||
|
}else{ |
||||
|
return new TorchPlateRecognition(getModelPath(plateRecognitionName, plateRecognitionNameModel)[0], plateRecognitionNameThread); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 构建特征提取器 |
||||
|
* @param plateDetection 车牌检测模型 |
||||
|
* @param plateRecognition 车牌识别模型 |
||||
|
*/ |
||||
|
@Bean(name = "visualPlateExtractor") |
||||
|
public PlateExtractor getPlateExtractor( |
||||
|
@Qualifier("visualPlateDetection")PlateDetection plateDetection, |
||||
|
@Qualifier("visualPlateRecognition")PlateRecognition plateRecognition |
||||
|
){ |
||||
|
return new PlateExtractorImpl(plateDetection, plateRecognition); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取模型路径 |
||||
|
* @param modelName 模型名称 |
||||
|
* @return |
||||
|
*/ |
||||
|
private String[] getModelPath(String modelName, String modelPath[]){ |
||||
|
|
||||
|
String basePath = "open-anpr-core/src/main/resources/"; |
||||
|
if("docker".equalsIgnoreCase(profile)){ |
||||
|
basePath = "/app/open-anpr/"; |
||||
|
} |
||||
|
|
||||
|
if((null == modelPath || modelPath.length != 1) && "TorchPlateDetection".equalsIgnoreCase(modelName)){ |
||||
|
return new String[]{basePath + "models/plate_detect.onnx"}; |
||||
|
} |
||||
|
|
||||
|
if((null == modelPath || modelPath.length != 1) && "TorchPlateRecognition".equalsIgnoreCase(modelName)){ |
||||
|
return new String[]{basePath + "models/plate_rec_color.onnx"}; |
||||
|
} |
||||
|
|
||||
|
return modelPath; |
||||
|
} |
||||
|
} |
@ -0,0 +1,28 @@ |
|||||
|
package com.visual.open.anpr.server.bootstrap.conf; |
||||
|
|
||||
|
import org.springframework.context.annotation.ComponentScan; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
|
||||
|
@Configuration("visualServerConfig") |
||||
|
public class ServerConfig { |
||||
|
|
||||
|
@Configuration |
||||
|
@ComponentScan("com.visual.open.anpr.server.utils") |
||||
|
public static class SearchUtils {} |
||||
|
|
||||
|
@Configuration |
||||
|
@ComponentScan("com.visual.open.anpr.server.config") |
||||
|
public static class SearchConfig {} |
||||
|
|
||||
|
@Configuration |
||||
|
@ComponentScan({"com.visual.open.anpr.server.service"}) |
||||
|
public static class ServiceConfig {} |
||||
|
|
||||
|
@Configuration |
||||
|
@ComponentScan({"com.visual.open.anpr.server.controller"}) |
||||
|
public static class ControllerConfig {} |
||||
|
|
||||
|
@Configuration |
||||
|
@ComponentScan({"com.visual.open.anpr.server.scheduler"}) |
||||
|
public static class SchedulerConfig {} |
||||
|
} |
@ -0,0 +1,10 @@ |
|||||
|
package com.visual.open.anpr.server.controller.base; |
||||
|
|
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
|
||||
|
public abstract class BaseController { |
||||
|
|
||||
|
public Logger logger = LoggerFactory.getLogger(getClass()); |
||||
|
|
||||
|
} |
@ -0,0 +1,17 @@ |
|||||
|
package com.visual.open.anpr.server.controller.base; |
||||
|
|
||||
|
import com.visual.open.anpr.server.domain.common.ResponseInfo; |
||||
|
import com.visual.open.anpr.server.utils.ResponseBuilder; |
||||
|
import org.springframework.web.bind.MethodArgumentNotValidException; |
||||
|
import org.springframework.web.bind.annotation.ExceptionHandler; |
||||
|
import org.springframework.web.bind.annotation.RestControllerAdvice; |
||||
|
|
||||
|
@RestControllerAdvice |
||||
|
public class GlobalExceptionHandler { |
||||
|
|
||||
|
@ExceptionHandler(MethodArgumentNotValidException.class) |
||||
|
public ResponseInfo<String> handleValidationExceptions(MethodArgumentNotValidException ex) { |
||||
|
return ResponseBuilder.error(ex.getBindingResult().getFieldError().getDefaultMessage()); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,25 @@ |
|||||
|
package com.visual.open.anpr.server.controller.health; |
||||
|
|
||||
|
import com.visual.open.anpr.server.domain.common.ResponseInfo; |
||||
|
import com.visual.open.anpr.server.utils.ResponseBuilder; |
||||
|
import io.swagger.annotations.Api; |
||||
|
import io.swagger.annotations.ApiOperation; |
||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||
|
import org.springframework.web.bind.annotation.RequestMethod; |
||||
|
import org.springframework.web.bind.annotation.ResponseBody; |
||||
|
import org.springframework.web.bind.annotation.RestController; |
||||
|
|
||||
|
|
||||
|
@Api(tags="02、公共服务-健康检测") |
||||
|
@RestController("healthController") |
||||
|
@RequestMapping("/common/health") |
||||
|
public class HealthController { |
||||
|
|
||||
|
@ApiOperation(value="公共-服务健康检测") |
||||
|
@ResponseBody |
||||
|
@RequestMapping(value = "/check", method = RequestMethod.GET) |
||||
|
public ResponseInfo<String> check(){ |
||||
|
return ResponseBuilder.success("health check is ok"); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1 @@ |
|||||
|
package com.visual.open.anpr.server.controller; |
@ -0,0 +1,48 @@ |
|||||
|
package com.visual.open.anpr.server.domain.common; |
||||
|
|
||||
|
import com.fasterxml.jackson.annotation.JsonFormat; |
||||
|
|
||||
|
import java.io.Serializable; |
||||
|
import java.util.Date; |
||||
|
|
||||
|
/** |
||||
|
* Entity基类 |
||||
|
* |
||||
|
* @author diven |
||||
|
*/ |
||||
|
public class BaseEntity implements Serializable |
||||
|
{ |
||||
|
private static final long serialVersionUID = 1L; |
||||
|
|
||||
|
/** 创建时间 */ |
||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
||||
|
private Date createTime; |
||||
|
|
||||
|
/** 更新时间 */ |
||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
||||
|
private Date updateTime; |
||||
|
|
||||
|
|
||||
|
public Date getCreateTime() |
||||
|
{ |
||||
|
return createTime; |
||||
|
} |
||||
|
|
||||
|
public void setCreateTime(Date createTime) |
||||
|
{ |
||||
|
this.createTime = createTime; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public Date getUpdateTime() |
||||
|
{ |
||||
|
return updateTime; |
||||
|
} |
||||
|
|
||||
|
public void setUpdateTime(Date updateTime) |
||||
|
{ |
||||
|
this.updateTime = updateTime; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
@ -0,0 +1,54 @@ |
|||||
|
package com.visual.open.anpr.server.domain.common; |
||||
|
|
||||
|
import io.swagger.annotations.ApiModelProperty; |
||||
|
|
||||
|
import java.io.Serializable; |
||||
|
|
||||
|
/** |
||||
|
* des:接口返回对象 |
||||
|
* @author diven |
||||
|
* @date 上午9:34 2018/7/12 |
||||
|
*/ |
||||
|
public class ResponseInfo<T> implements Serializable{ |
||||
|
|
||||
|
private static final long serialVersionUID = -6919611972884058300L; |
||||
|
|
||||
|
@ApiModelProperty(value="返回代码",name="code",required = true, position = 0) |
||||
|
private Integer code; |
||||
|
@ApiModelProperty(value="返回信息",name="message",required = false, position = 1) |
||||
|
private String message; |
||||
|
@ApiModelProperty(value="数据信息",name="data",required = false, position = 2) |
||||
|
private T data; |
||||
|
|
||||
|
public ResponseInfo(){} |
||||
|
|
||||
|
public ResponseInfo(Integer code, String message, T data) { |
||||
|
this.code = code; |
||||
|
this.message = message; |
||||
|
this.data = data; |
||||
|
} |
||||
|
|
||||
|
public Integer getCode() { |
||||
|
return code; |
||||
|
} |
||||
|
|
||||
|
public void setCode(Integer code) { |
||||
|
this.code = code; |
||||
|
} |
||||
|
|
||||
|
public String getMessage() { |
||||
|
return message; |
||||
|
} |
||||
|
|
||||
|
public void setMessage(String message) { |
||||
|
this.message = message; |
||||
|
} |
||||
|
|
||||
|
public T getData() { |
||||
|
return data; |
||||
|
} |
||||
|
|
||||
|
public void setData(T data) { |
||||
|
this.data = data; |
||||
|
} |
||||
|
} |
@ -0,0 +1 @@ |
|||||
|
package com.visual.open.anpr.server.domain; |
@ -0,0 +1 @@ |
|||||
|
package com.visual.open.anpr.server; |
@ -0,0 +1,61 @@ |
|||||
|
package com.visual.open.anpr.server.utils; |
||||
|
|
||||
|
|
||||
|
import com.visual.open.anpr.server.domain.common.ResponseInfo; |
||||
|
|
||||
|
public class ResponseBuilder { |
||||
|
|
||||
|
public static final Integer COMMON_SUCCESS_CODE = 0; |
||||
|
public static final String COMMON_SUCCESS_INFO = "success"; |
||||
|
|
||||
|
public static final Integer COMMON_EXCEPTION_CODE = 1; |
||||
|
public static final String COMMON_EXCEPTION_INFO = "exception"; |
||||
|
|
||||
|
public static final Integer COMMON_ERROR_CODE = 2; |
||||
|
public static final String COMMON_ERROR_INFO = "error"; |
||||
|
|
||||
|
public static <T> ResponseInfo<T> success(){ |
||||
|
return new ResponseInfo<>(COMMON_SUCCESS_CODE,COMMON_SUCCESS_INFO, null); |
||||
|
} |
||||
|
|
||||
|
public static <T> ResponseInfo<T> success(T data){ |
||||
|
return new ResponseInfo<>(COMMON_SUCCESS_CODE,COMMON_SUCCESS_INFO, data); |
||||
|
} |
||||
|
|
||||
|
public static <T> ResponseInfo<T> error(){ |
||||
|
return new ResponseInfo<>(COMMON_ERROR_CODE,COMMON_ERROR_INFO, null); |
||||
|
} |
||||
|
|
||||
|
public static <T> ResponseInfo<T> error(String errorInfo){ |
||||
|
return new ResponseInfo<>(COMMON_ERROR_CODE,errorInfo, null); |
||||
|
} |
||||
|
|
||||
|
public static <T> ResponseInfo<T> error(T data){ |
||||
|
return new ResponseInfo<>(COMMON_ERROR_CODE,COMMON_ERROR_INFO, data); |
||||
|
} |
||||
|
|
||||
|
public static <T> ResponseInfo<T> error(T data, String errorInfo){ |
||||
|
return new ResponseInfo<>(COMMON_ERROR_CODE,errorInfo, data); |
||||
|
} |
||||
|
|
||||
|
public static <T> ResponseInfo<T> exception(){ |
||||
|
return new ResponseInfo<>(COMMON_EXCEPTION_CODE, COMMON_EXCEPTION_INFO, null); |
||||
|
} |
||||
|
|
||||
|
public static <T> ResponseInfo<T> exception(T data){ |
||||
|
return new ResponseInfo<>(COMMON_EXCEPTION_CODE, COMMON_EXCEPTION_INFO, data); |
||||
|
} |
||||
|
|
||||
|
public static <T> ResponseInfo<T> exception(Exception e){ |
||||
|
return new ResponseInfo<>(COMMON_EXCEPTION_CODE, e.getMessage(), null); |
||||
|
} |
||||
|
|
||||
|
public static <T> ResponseInfo<T> exception(Exception e, T data){ |
||||
|
return new ResponseInfo<>(COMMON_EXCEPTION_CODE, e.getMessage(), data); |
||||
|
} |
||||
|
|
||||
|
public static <T> ResponseInfo<T> exception(String info, T data){ |
||||
|
return new ResponseInfo<>(COMMON_EXCEPTION_CODE, info, data); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,47 @@ |
|||||
|
# 开发环境配置 |
||||
|
server: |
||||
|
# 服务器的HTTP端口,默认为80 |
||||
|
port: 8080 |
||||
|
servlet: |
||||
|
# 应用的访问路径 |
||||
|
context-path: / |
||||
|
tomcat: |
||||
|
# tomcat的URI编码 |
||||
|
uri-encoding: UTF-8 |
||||
|
# tomcat最大线程数,默认为200 |
||||
|
max-threads: 10 |
||||
|
# Tomcat启动初始化的线程数,默认值25 |
||||
|
min-spare-threads: 5 |
||||
|
|
||||
|
# 日志配置 |
||||
|
logging: |
||||
|
level: |
||||
|
com.visual.open.anpr: info |
||||
|
org.springframework: warn |
||||
|
|
||||
|
# 模型配置 |
||||
|
visual: |
||||
|
model: |
||||
|
plateDetection: |
||||
|
name: TorchPlateDetection |
||||
|
modelPath: |
||||
|
thread: 1 |
||||
|
plateRecognition: |
||||
|
name: TorchPlateRecognition |
||||
|
modelPath: |
||||
|
thread: 1 |
||||
|
swagger: |
||||
|
enable: true |
||||
|
|
||||
|
# Spring配置 |
||||
|
spring: |
||||
|
jackson: |
||||
|
time-zone: GMT+8 |
||||
|
date-format: yyyy-MM-dd HH:mm:ss |
||||
|
# 文件上传 |
||||
|
servlet: |
||||
|
multipart: |
||||
|
# 单个文件大小 |
||||
|
max-file-size: 10MB |
||||
|
# 设置总上传的文件大小 |
||||
|
max-request-size: 20MB |
@ -0,0 +1,47 @@ |
|||||
|
# 开发环境配置 |
||||
|
server: |
||||
|
# 服务器的HTTP端口,默认为80 |
||||
|
port: 8080 |
||||
|
servlet: |
||||
|
# 应用的访问路径 |
||||
|
context-path: / |
||||
|
tomcat: |
||||
|
# tomcat的URI编码 |
||||
|
uri-encoding: UTF-8 |
||||
|
# tomcat最大线程数,默认为200 |
||||
|
max-threads: 80 |
||||
|
# Tomcat启动初始化的线程数,默认值25 |
||||
|
min-spare-threads: 30 |
||||
|
|
||||
|
# 日志配置 |
||||
|
logging: |
||||
|
level: |
||||
|
com.visual.face.search: info |
||||
|
org.springframework: warn |
||||
|
|
||||
|
# 模型配置 |
||||
|
visual: |
||||
|
model: |
||||
|
plateDetection: |
||||
|
name: ${VISUAL_MODEL_PLATE_DETECTION_NAME:TorchPlateDetection} |
||||
|
modelPath: ${VISUAL_MODEL_PLATE_DETECTION_PATH:} |
||||
|
thread: ${VISUAL_MODEL_PLATE_DETECTION_THREAD:4} |
||||
|
plateRecognition: |
||||
|
name: ${VISUAL_MODEL_PLATE_RECOGNITION_NAME:TorchPlateRecognition} |
||||
|
modelPath: ${VISUAL_MODEL_PLATE_RECOGNITION_PATH:} |
||||
|
thread: ${VISUAL_MODEL_PLATE_RECOGNITION_THREAD:4} |
||||
|
swagger: |
||||
|
enable: ${VISUAL_SWAGGER_ENABLE:true} |
||||
|
|
||||
|
# Spring配置 |
||||
|
spring: |
||||
|
jackson: |
||||
|
time-zone: GMT+8 |
||||
|
date-format: yyyy-MM-dd HH:mm:ss |
||||
|
# 文件上传 |
||||
|
servlet: |
||||
|
multipart: |
||||
|
# 单个文件大小 |
||||
|
max-file-size: 10MB |
||||
|
# 设置总上传的文件大小 |
||||
|
max-request-size: 20MB |
@ -0,0 +1,47 @@ |
|||||
|
# 开发环境配置 |
||||
|
server: |
||||
|
# 服务器的HTTP端口,默认为80 |
||||
|
port: 8080 |
||||
|
servlet: |
||||
|
# 应用的访问路径 |
||||
|
context-path: / |
||||
|
tomcat: |
||||
|
# tomcat的URI编码 |
||||
|
uri-encoding: UTF-8 |
||||
|
# tomcat最大线程数,默认为200 |
||||
|
max-threads: 10 |
||||
|
# Tomcat启动初始化的线程数,默认值25 |
||||
|
min-spare-threads: 5 |
||||
|
|
||||
|
# 日志配置 |
||||
|
logging: |
||||
|
level: |
||||
|
com.visual.open.anpr: info |
||||
|
org.springframework: warn |
||||
|
|
||||
|
# 模型配置 |
||||
|
visual: |
||||
|
model: |
||||
|
plateDetection: |
||||
|
name: TorchPlateDetection |
||||
|
modelPath: |
||||
|
thread: 1 |
||||
|
plateRecognition: |
||||
|
name: TorchPlateRecognition |
||||
|
modelPath: |
||||
|
thread: 1 |
||||
|
swagger: |
||||
|
enable: true |
||||
|
|
||||
|
# Spring配置 |
||||
|
spring: |
||||
|
jackson: |
||||
|
time-zone: GMT+8 |
||||
|
date-format: yyyy-MM-dd HH:mm:ss |
||||
|
# 文件上传 |
||||
|
servlet: |
||||
|
multipart: |
||||
|
# 单个文件大小 |
||||
|
max-file-size: 10MB |
||||
|
# 设置总上传的文件大小 |
||||
|
max-request-size: 20MB |
@ -0,0 +1,8 @@ |
|||||
|
spring: |
||||
|
application: |
||||
|
name: open-anpr |
||||
|
mvc: |
||||
|
pathmatch: |
||||
|
matching-strategy: ant_path_matcher |
||||
|
profiles: |
||||
|
active: local |
@ -0,0 +1,72 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
<configuration> |
||||
|
<!-- 控制台打印日志的相关配置 --> |
||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> |
||||
|
<!-- 日志格式 --> |
||||
|
<encoder> |
||||
|
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%level] - %m%n</pattern> |
||||
|
</encoder> |
||||
|
</appender> |
||||
|
<!-- 文件保存日志的相关配置 --> |
||||
|
<appender name="INFO-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
||||
|
<!-- 保存日志文件的路径 --> |
||||
|
<file>./logs/open-anpr-info.log</file> |
||||
|
<!-- 日志格式 --> |
||||
|
<encoder> |
||||
|
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%class:%line] - %m%n</pattern> |
||||
|
</encoder> |
||||
|
|
||||
|
<!-- 循环政策:基于时间创建日志文件 --> |
||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
||||
|
<!-- 日志文件名格式 --> |
||||
|
<fileNamePattern>./logs/open-anpr-info.%d{yyyy-MM-dd}.log</fileNamePattern> |
||||
|
<!-- 最大保存时间:10天--> |
||||
|
<maxHistory>7</maxHistory> |
||||
|
</rollingPolicy> |
||||
|
</appender> |
||||
|
|
||||
|
<appender name="ERROR-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
||||
|
<!-- 保存日志文件的路径 --> |
||||
|
<file>./logs/open-anpr-error.log</file> |
||||
|
<!-- 日志格式 --> |
||||
|
<encoder> |
||||
|
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%class:%line] - %m%n</pattern> |
||||
|
</encoder> |
||||
|
<!-- 日志级别过滤器 --> |
||||
|
<filter class="ch.qos.logback.classic.filter.LevelFilter"> |
||||
|
<!-- 过滤的级别 --> |
||||
|
<level>ERROR</level> |
||||
|
<!-- 匹配时的操作:接收(记录) --> |
||||
|
<onMatch>ACCEPT</onMatch> |
||||
|
<!-- 不匹配时的操作:拒绝(不记录) --> |
||||
|
<onMismatch>DENY</onMismatch> |
||||
|
</filter> |
||||
|
<!-- 循环政策:基于时间创建日志文件 --> |
||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
||||
|
<!-- 日志文件名格式 --> |
||||
|
<fileNamePattern>./logs/open-anpr-error.%d{yyyy-MM-dd}.log</fileNamePattern> |
||||
|
<!-- 最大保存时间:10天--> |
||||
|
<maxHistory>7</maxHistory> |
||||
|
</rollingPolicy> |
||||
|
</appender> |
||||
|
<root level="INFO"> |
||||
|
<appender-ref ref="STDOUT"/> |
||||
|
<appender-ref ref="INFO-OUT"/> |
||||
|
<appender-ref ref="ERROR-OUT" /> |
||||
|
</root> |
||||
|
<!-- 彩色日志 --> |
||||
|
<!-- 彩色日志依赖的渲染类 --> |
||||
|
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /> |
||||
|
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /> |
||||
|
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /> |
||||
|
<!-- 彩色日志格式 --> |
||||
|
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" /> |
||||
|
<!-- Console 输出设置 --> |
||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> |
||||
|
<encoder> |
||||
|
<pattern>${CONSOLE_LOG_PATTERN}</pattern> |
||||
|
<charset>utf8</charset> |
||||
|
</encoder> |
||||
|
</appender> |
||||
|
|
||||
|
</configuration> |
Loading…
Reference in new issue