diff --git a/.gitignore b/.gitignore index 2f92659c5364df5ffc0cb137c5c9b9780adc92e6..1cac33f04974f38514f765fe6c91aad72eeb0a1b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ /target/ +/log/* .classpath .project @@ -10,7 +11,7 @@ .idea/* stuServer/.idea/* stuServer/target/* -##filter databfilesln file## +##filter databfile��sln file## *.mdb ? diff --git a/README.md b/README.md index 6b1ed244d567bbefc7a739697cd756279171626b..c98e9c5b681c0b1855132ce90ca4853143ea9c2e 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,13 @@ SET locked=0, lockgranted=null, lockedby=null WHERE id=1 -#### 6.说在最后 +#### 6.开发记录 +文件管理: +1、前端上传图片/文件,将图片名字改成uuid,存放到指定位置,在文件表记录一条信息,用到图片的表中记录id。 +2、定时任务,在规定时间去检查文件表,已经删除的文件进行清除 + + +#### 7.说在最后 1. 系统正在开发,想到的后面再更新 2. 正在学习使用这些技术,若有错误 不对之处欢迎大佬指正 diff --git a/src/main/java/com/stu/stusystem/StusystemApplication.java b/src/main/java/com/stu/stusystem/StusystemApplication.java index 86e419279b38e58ac774eab545b001199a54d91f..c34c8aaafd174fbe83e0e31d94681584ade2d75d 100644 --- a/src/main/java/com/stu/stusystem/StusystemApplication.java +++ b/src/main/java/com/stu/stusystem/StusystemApplication.java @@ -5,6 +5,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.core.env.Environment; +import org.springframework.scheduling.annotation.EnableScheduling; import tk.mybatis.spring.annotation.MapperScan; import java.net.InetAddress; diff --git a/src/main/java/com/stu/stusystem/config/SocketConfig.java b/src/main/java/com/stu/stusystem/config/SocketConfig.java index 5563f39db7cd7c6413e5b92ae465a4eea7dcabc5..e658e3fd6215f1342767a4ea76fd998a92e7533e 100644 --- a/src/main/java/com/stu/stusystem/config/SocketConfig.java +++ b/src/main/java/com/stu/stusystem/config/SocketConfig.java @@ -2,6 +2,8 @@ package com.stu.stusystem.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.TaskScheduler; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @@ -18,4 +20,13 @@ public class SocketConfig { public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter(); } + + // 解决不能同时使用websocket和spring的定时注解 + @Bean + public TaskScheduler taskScheduler() { + ThreadPoolTaskScheduler scheduling = new ThreadPoolTaskScheduler(); + scheduling.setPoolSize(10); + scheduling.initialize(); + return scheduling; + } } \ No newline at end of file diff --git a/src/main/java/com/stu/stusystem/config/WebConfigImpl.java b/src/main/java/com/stu/stusystem/config/WebConfigImpl.java index 6a9b46ed4a970b8da81b232c159aa17c646b205e..3a0fdbc34a7f68f8ca484a7b5fb3d3b147a2326c 100644 --- a/src/main/java/com/stu/stusystem/config/WebConfigImpl.java +++ b/src/main/java/com/stu/stusystem/config/WebConfigImpl.java @@ -1,10 +1,13 @@ package com.stu.stusystem.config; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import javax.validation.Valid; + /** * @author cxt * @date 2020/9/9 @@ -13,9 +16,13 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Component public class WebConfigImpl implements WebMvcConfigurer { + @Value("${filePath}") + private String filePath; + @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); + registry.addResourceHandler("/file/**").addResourceLocations("file:"+filePath); } @Override diff --git a/src/main/java/com/stu/stusystem/controller/system/DocumentController.java b/src/main/java/com/stu/stusystem/controller/system/DocumentController.java new file mode 100644 index 0000000000000000000000000000000000000000..dd626e2a9b0c5e6eff836995908f48b12ba291b9 --- /dev/null +++ b/src/main/java/com/stu/stusystem/controller/system/DocumentController.java @@ -0,0 +1,82 @@ +package com.stu.stusystem.controller.system; + +import com.stu.stusystem.common.ApiException; +import com.stu.stusystem.common.ApiResult; +import com.stu.stusystem.model.system.Document; +import com.stu.stusystem.service.system.DocumentService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import liquibase.util.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @author: cxt + * @time: 2021/6/24 + */ +@Api(tags = "文件管理") +@RestController +@EnableScheduling +@RequestMapping("/document") +public class DocumentController { + + private DocumentService documentService; + + @ApiOperation("formData格式") + @GetMapping("/formData") + public ApiResult saveFormData(@RequestParam("file") MultipartFile file) { + return ApiResult.success(this.documentService.saveFormData(file)); + } + + @ApiOperation("formData格式") + @GetMapping("/files") + public ApiResult saveFiles(@RequestParam("files") MultipartFile[] files) { + String[] str = new String[files.length]; + int i = 0; + for (MultipartFile file : files) { + str[i++] = this.documentService.saveFormData(file); + } + String join = StringUtils.join(str, ","); + return ApiResult.success(join); + } + + @ApiOperation("base64格式") + @PostMapping("/base64") + public ApiResult saveBase64(@RequestParam("file") String file, @RequestParam("fileName") String fileName) { + if (file.length() == 0) { + throw new ApiException("文件数据不能为空"); + } + return ApiResult.success(this.documentService.saveBase64(file, fileName)); + } + + @ApiOperation("根据id查询") + @GetMapping("/get/{id}") + public Document getDocument(@PathVariable("id") String id) { + return this.documentService.getDocument(id); + } + + @ApiOperation("根据id查询多个文件") + @GetMapping("/get/ids") + public List getDocuments(@RequestParam("ids") String ids) { + if ("".equals(ids)) { + throw new ApiException("参数不能为空"); + } + return this.documentService.getDocuments(ids); + } + + @ApiOperation("删除文件") + @DeleteMapping("/remove/{id}") + public ApiResult remove(@PathVariable("id") String id) { + this.documentService.remove(id); + return ApiResult.success(); + } + + @Autowired + public void setDocumentService(DocumentService documentService) { + this.documentService = documentService; + } +} diff --git a/src/main/java/com/stu/stusystem/mapper/system/DocumentMapper.java b/src/main/java/com/stu/stusystem/mapper/system/DocumentMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..d129b9b9010758be3fa44b8fa9a820f2d045ad3b --- /dev/null +++ b/src/main/java/com/stu/stusystem/mapper/system/DocumentMapper.java @@ -0,0 +1,11 @@ +package com.stu.stusystem.mapper.system; + +import com.stu.stusystem.common.CommonMapper; +import com.stu.stusystem.model.system.Document; + +/** + * @author: cxt + * @time: 2021/6/24 + */ +public interface DocumentMapper extends CommonMapper { +} diff --git a/src/main/java/com/stu/stusystem/model/em/FileType.java b/src/main/java/com/stu/stusystem/model/em/FileType.java new file mode 100644 index 0000000000000000000000000000000000000000..e1b88849367661f682c83fcaa1db4898aca5e8ef --- /dev/null +++ b/src/main/java/com/stu/stusystem/model/em/FileType.java @@ -0,0 +1,169 @@ +package com.stu.stusystem.model.em; +/** + * 文件类型枚取 + */ +public enum FileType { + /** + * JEPG. + */ + JPEG("FFD8FF"), + + /** + * PNG. + */ + PNG("89504E47"), + + /** + * GIF. + */ + GIF("47494638"), + + /** + * TIFF. + */ + TIFF("49492A00"), + + /** + * Windows Bitmap. + */ + BMP("424D"), + + /** + * CAD. + */ + DWG("41433130"), + + /** + * Adobe Photoshop. + */ + PSD("38425053"), + + /** + * Rich Text Format. + */ + RTF("7B5C727466"), + + /** + * XML. + */ + XML("3C3F786D6C"), + + /** + * HTML. + */ + HTML("68746D6C3E"), + + /** + * Email [thorough only]. + */ + EML("44656C69766572792D646174653A"), + + /** + * Outlook Express. + */ + DBX("CFAD12FEC5FD746F"), + + /** + * Outlook (pst). + */ + PST("2142444E"), + + /** + * MS Word/Excel. + */ + XLS_DOC("D0CF11E0"), + + /** + * MS Access. + */ + MDB("5374616E64617264204A"), + + /** + * WordPerfect. + */ + WPD("FF575043"), + + /** + * Postscript. + */ + EPS("252150532D41646F6265"), + + /** + * Adobe Acrobat. + */ + PDF("255044462D312E"), + + /** + * Quicken. + */ + QDF("AC9EBD8F"), + + /** + * Windows Password. + */ + PWL("E3828596"), + + /** + * ZIP Archive. + */ + ZIP("504B0304"), + + /** + * RAR Archive. + */ + RAR("52617221"), + + /** + * Wave. + */ + WAV("57415645"), + + /** + * AVI. + */ + AVI("41564920"), + + /** + * Real Audio. + */ + RAM("2E7261FD"), + + /** + * Real Media. + */ + RM("2E524D46"), + + /** + * MPEG (mpg). + */ + MPG("000001BA"), + + /** + * Quicktime. + */ + MOV("6D6F6F76"), + + /** + * Windows Media. + */ + ASF("3026B2758E66CF11"), + + /** + * MIDI. + */ + MID("4D546864"); + + private String value = ""; + + private FileType(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/src/main/java/com/stu/stusystem/model/system/Document.java b/src/main/java/com/stu/stusystem/model/system/Document.java new file mode 100644 index 0000000000000000000000000000000000000000..b8b3435f5571d0797858828fbf7792ac52514536 --- /dev/null +++ b/src/main/java/com/stu/stusystem/model/system/Document.java @@ -0,0 +1,41 @@ +package com.stu.stusystem.model.system; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Id; +import java.util.Date; + +/** + * @author: cxt + * @time: 2021/6/24 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Document { + @Id + private String id; + + // 名称 + private String name; + + // 类型 + private String fileType; + + // 后缀名 + private String suffix; + + // 地址 + private String filePath; + + // 大小 + private Long fileSize; + + // 创建时间 + private Date creatTime; + + // 是否删除 + private Integer isDelete; +} diff --git a/src/main/java/com/stu/stusystem/service/system/DocumentService.java b/src/main/java/com/stu/stusystem/service/system/DocumentService.java new file mode 100644 index 0000000000000000000000000000000000000000..d265a52e3299a0e0b111bd42f7058e282305c5f4 --- /dev/null +++ b/src/main/java/com/stu/stusystem/service/system/DocumentService.java @@ -0,0 +1,255 @@ +package com.stu.stusystem.service.system; + +import com.stu.stusystem.common.ApiException; +import com.stu.stusystem.mapper.system.DocumentMapper; +import com.stu.stusystem.model.system.Document; +import com.stu.stusystem.util.FileTypeJudgeUtil; +import com.stu.stusystem.util.UUIDUtil; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import sun.misc.BASE64Decoder; +import tk.mybatis.mapper.entity.Example; +import tk.mybatis.mapper.weekend.WeekendSqls; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + + +/** + * @author: cxt + * @time: 2021/6/24 + */ +@Service +@Log4j2 +public class DocumentService { + + @Value("${filePath}") + private String filePath; + + private DocumentMapper documentMapper; + + private static final Integer maxFileByteSize = 10 * 1024 * 1024; + + private final SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); + + // 特殊文件类型 + private static final ArrayList FILETYPE = new ArrayList<>(Arrays.asList("TXT", "MD")); + + /** + * formData保存文件 + * + * @param file 文件 + * @return 保存后的文件id + */ + @Transactional + public String saveFormData(MultipartFile file) { + long size = file.getSize(); + if (size > maxFileByteSize) { + throw new ApiException("上传文件不能大于10MB"); + } + String name = file.getOriginalFilename(); + if (name == null) { + throw new ApiException("文件名称为空"); + } + String id = UUIDUtil.generate(); + String[] split = name.split("\\."); + String fileName = id + "." + split[1]; + + // 文件保存到磁盘 + String path = ""; + try { + path = saveFile(file.getBytes(), fileName); + } catch (IOException e) { + log.error("保存文件出错"); + } + + // 真实的文件类型判断 + String fileType = null; + String upperCase = split[1].toUpperCase(); + if (FILETYPE.contains(upperCase)) { + fileType = upperCase; + } else { + byte[] b = new byte[10]; + InputStream inputStream = null; + try { + inputStream = file.getInputStream(); + int read = inputStream.read(b, 0, 10); + if (read != 0) { + fileType = FileTypeJudgeUtil.getTypeByByte(b); + if (fileType == null) { + throw new ApiException("系统不支持浏览您上传的文件"); + } + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + // 保存到数据库 + Document document = new Document(id, split[0], fileType, split[1], path, size, new Date(), 0); + return saveDocument(document); + } + + /** + * 保存Base64格式 + * + * @param file 文件Base64码 + * @param fileName 文件名称 + * @return 保存后的文件id + */ + @Transactional + public String saveBase64(String file, String fileName) { + String[] split = file.split("base64,"); + // 图片格式 + String fileTile = split[0].substring(10, 14); + // 实体数据 + String data = split[1]; + long size = data.length() * 3 / 4; + String id = UUIDUtil.generate(); + String path = ""; + + // 保存在磁盘 + BASE64Decoder decoder = new BASE64Decoder(); + try { + byte[] bytes = decoder.decodeBuffer(file); + path = saveFile(bytes, id + "." + fileTile); + } catch (IOException e) { + e.printStackTrace(); + } + + // 保存到数据库 + Document document = new Document(id, fileName, fileTile, fileTile, path, size, new Date(), 0); + return saveDocument(document); + } + + /** + * 数据写入磁盘 + * + * @param data 文件数据 + * @param fileName 文件新名称 + * @return 文件存储地址 + */ + public String saveFile(byte[] data, String fileName) { + if (data == null || data.length == 0) { + throw new ApiException("文件数据为空"); + } + String folder = this.format.format(new Date()); + String format = filePath + "/" + folder; + File file = new File(format); + if (!file.exists()) { + if (!file.mkdirs()) { + log.error("创建文件夹失败:{}", format); + } + } + String path = format + "/" + fileName; + try { + Files.write(Paths.get(path), data); + } catch (IOException e) { + log.error("文件保存失败:{}", format); + e.printStackTrace(); + } + return folder + "/" + fileName; + } + + /** + * 记录到数据库 + * + * @param document 文件对象 + * @return 保存后的文件id + */ + public String saveDocument(Document document) { + int insert = this.documentMapper.insert(document); + if (insert == 0) { + throw new ApiException(ApiException.SAVE_FAIL); + } + return document.getId(); + } + + /** + * 根据id查询 + */ + public Document getDocument(String id) { + return this.documentMapper.selectByPrimaryKey(id); + } + + /** + * 根据id查询多个文件 + */ + public List getDocuments(String ids) { + String[] split = ids.split(","); + ArrayList list = new ArrayList<>(Arrays.asList(split)); + Example example = new Example(Document.class); + example.createCriteria().andIn("id", list); + return this.documentMapper.selectByExample(example); + } + + /** + * 删除id + */ + public void remove(String id) { + Document document = new Document(); + document.setId(id); + document.setIsDelete(1); + Example example = new Example(Document.class); + example.excludeProperties().createCriteria().andEqualTo("id", id); + int i = this.documentMapper.updateByExampleSelective(document, example); + if (i == 0) { + throw new ApiException(ApiException.DELETE_FAIL); + } + } + + /** + * 每天0时清除定时清除删除文件 + */ + @Scheduled(cron = "0 0 0 * * ?") + public void regularRemove() { + List list = this.documentMapper.selectByExample(new Example.Builder(Document.class) + .where(WeekendSqls.custom().andEqualTo(Document::getIsDelete, 1)).build()); + for (Document document : list) { + String path = filePath + document.getFilePath(); + deleteFile(path); + } + this.documentMapper.deleteByExample(new Example.Builder(Document.class) + .where(WeekendSqls.custom().andEqualTo(Document::getIsDelete, 1)).build()); + } + + /** + * 删除文件 + */ + public static void deleteFile(String fileName) { + File file = new File(fileName); + if (file.exists() && file.isFile()) { + if (file.delete()) { + log.debug("删除单个文件:" + fileName + "->成功!"); + } else { + log.debug("删除单个文件:" + fileName + "->失败!"); + } + } + } + + @Autowired + public void setDocumentMapper(DocumentMapper documentMapper) { + this.documentMapper = documentMapper; + } +} diff --git a/src/main/java/com/stu/stusystem/util/FileTypeJudgeUtil.java b/src/main/java/com/stu/stusystem/util/FileTypeJudgeUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..c2a02a533bc4676594656f6ca7fa2025245900fc --- /dev/null +++ b/src/main/java/com/stu/stusystem/util/FileTypeJudgeUtil.java @@ -0,0 +1,108 @@ +package com.stu.stusystem.util; + +import com.stu.stusystem.common.ApiException; +import com.stu.stusystem.model.em.FileType; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * @author: cxt + * @time: 2021/6/25 + */ +public class FileTypeJudgeUtil { + + /** + * 将文件头转换成16进制字符串 + * + * @param src 原生byte[] + * @return 16进制字符串 + */ + private static String bytesToHexString(byte[] src) { + StringBuilder stringBuilder = new StringBuilder(); + if (src == null || src.length <= 0) { + return null; + } + for (int i = 0; i < src.length; i++) { + int v = src[i] & 0xFF; + String hv = Integer.toHexString(v); + if (hv.length() < 2) { + stringBuilder.append(0); + } + stringBuilder.append(hv); + } + return stringBuilder.toString(); + } + + /** + * 根据文件路径获取文件头 + * + * @param filePath 文件路径 + * @return 文件头 + */ + private static String getFileContent(String filePath) { + byte[] b = new byte[10]; + InputStream inputStream = null; + try { + inputStream = new FileInputStream(filePath); + inputStream.read(b, 0, 10); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return bytesToHexString(b); + } + + /** + * 根据文件头字符串判断文件类型 + * + * @param fileHead 文件头字符串 + * @return String 文件类型 + */ + private static String judgeType(String fileHead) { + FileType[] fileTypes = FileType.values(); + for (FileType type : fileTypes) { + // startsWith 检测是否以指定前缀开始 + String value = type.getValue(); + if (fileHead.toUpperCase().startsWith(value)) { + return type.toString(); + } + } + return null; + } + + /** + * 根据文件路径判断文件类型 + * + * @param filePath 文件路径 + * @return String 文件类型 + */ + public static String getTypeByPath(String filePath) { + String fileHead = getFileContent(filePath); + if (fileHead == null || fileHead.length() == 0) { + throw new ApiException("根据文件路径获取文件头失败"); + } + return judgeType(fileHead); + } + + + /** + * 根据文件头字节数进行判断文件类型 + * + * @param title 10字节文件头数据 + * @return String 文件类型 + */ + public static String getTypeByByte(byte[] title) { + String fileHead = bytesToHexString(title); + return judgeType(fileHead); + } + +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 6eb03b4a63f6da5dc16f08f5cdd89070b6738a16..d7305b2c72633dedf8eb6462c9fd6efca3808651 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -7,5 +7,13 @@ spring: username: cxt password: cxt104926 +# Liquibase 配置 +liquibase: + url: jdbc:mysql://localhost:3306/stusystem?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 + driver: com.mysql.jdbc.Driver + password: root + username: root + enabled: true + change-log: classpath:config/master.xml diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 140e62cc72d2f9cb5814f2b3aaa043b948d8c412..bce6439210b0b18df5e4e1281cd857d9c622bdf8 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -23,15 +23,6 @@ spring: multipart: max-file-size: 10MB max-request-size: 50MB -# thymeleaf: -# # 模板缓存 -# cache: false -# # 检查模板地址是否正确 -# check-template-location: true -# # 启用Thymeleaf视图解析 -# enabled: true -# # SpringEL编译器 -# enable-spring-el-compiler: false # 配置myBatis mybatis: @@ -41,16 +32,10 @@ mybatis: pagehelper: helper-dialect: mysql -# Liquibase 配置 -liquibase: - url: jdbc:mysql://localhost:3306/stusystem?useUnicode=true&characterEncoding=utf-8 - driver: com.mysql.jdbc.Driver - password: root - username: root - enabled: true - change-log: classpath:config/master.xml - # log日志配置文件 logging: config: classpath:config/logback-boot.xml +# file文件存储地址 +filePath: E:/file/ + diff --git a/src/main/resources/config/liquibase/20210624_creat_table_document.xml b/src/main/resources/config/liquibase/20210624_creat_table_document.xml new file mode 100644 index 0000000000000000000000000000000000000000..ac112b4f9a5d6905a0a512994bf97a3d975b7eaf --- /dev/null +++ b/src/main/resources/config/liquibase/20210624_creat_table_document.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/config/logback-boot.xml b/src/main/resources/config/logback-boot.xml index 683e43f57d5f4486de665e1f65c4ec9f13313727..0c9af45807f6e423061c8d86095e6532fc9f3f56 100644 --- a/src/main/resources/config/logback-boot.xml +++ b/src/main/resources/config/logback-boot.xml @@ -1,5 +1,5 @@ - + @@ -22,7 +22,7 @@ ${LOG_HOME}/mylog/%d.%i.log 30 - + 100KB @@ -38,11 +38,11 @@ - + - + \ No newline at end of file diff --git a/src/main/resources/config/master.xml b/src/main/resources/config/master.xml index d019b980872438508b0148f953ed0b362f3943b8..7618be7f12956d8048bc86f90ff1db5d8971b236 100644 --- a/src/main/resources/config/master.xml +++ b/src/main/resources/config/master.xml @@ -12,5 +12,6 @@ + \ No newline at end of file