微网站缺点,商城平台系统下载,企腾做的网站怎么样,移动应用开发就业前景文章目录 前言功能简述1. 自定义日志文件名2. 归档规则 压缩2.1. 归档配置2.2. 归档压缩2.3. 日志格式 编码 现象原因解决办法 前言
在 Springboot 应用中#xff0c;默认使用 logback-spring.xml 配置日志相关
功能简述
1. 自定义日志文件名 fi… 文章目录 前言功能简述1. 自定义日志文件名2. 归档规则 压缩2.1. 归档配置2.2. 归档压缩2.3. 日志格式 编码 现象原因解决办法 前言
在 Springboot 应用中默认使用 logback-spring.xml 配置日志相关
功能简述
1. 自定义日志文件名 file${log.path}/sys-info.log/file2. 归档规则 压缩
2.1. 归档配置 rollingPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy!-- 日志文件名格式 --fileNamePattern${log.path}/sys-info.%d{yyyy-MM-dd}.log/fileNamePattern!-- 单个文件最大大小 --maxFileSize50MB/maxFileSize!-- 日志最大的历史 60天 --maxHistory60/maxHistory/rollingPolicy2.2. 归档压缩
通过 fileNamePattern 文件后缀判断是否压缩支持 GZ、ZIP rollingPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy!-- 日志文件名格式 --fileNamePattern${log.path}/sys-info.%d{yyyy-MM-dd}.log.gz/fileNamePattern!-- 单个文件最大大小 --maxFileSize50MB/maxFileSize!-- 日志最大的历史 60天 --maxHistory60/maxHistory/rollingPolicy源码伪代码 switch (compressionMode) {case GZ:if (fileNamePatternStr.endsWith(.gz))return fileNamePatternStr.substring(0, len - 3);elsereturn fileNamePatternStr;case ZIP:if (fileNamePatternStr.endsWith(.zip))return fileNamePatternStr.substring(0, len - 4);elsereturn fileNamePatternStr;case NONE:return fileNamePatternStr;}2.3. 日志格式 编码 encoder!-- 编码 --charsetUTF-8/charset!-- 日志格式 --pattern${log.pattern}/pattern/encoder现象
多个进程或者实例 的日志同时打印在 同一个文件 中且日志文件归档使用 压缩日志目录下出现了大量的 .tmp 临时文件占用内存
原因
归档伪代码 // 无压缩if (compressionMode CompressionMode.NONE) {// 配置 file 标签if (getParentsRawFileProperty() ! null) {// 直接重命名归档renameUtil.rename(getParentsRawFileProperty(), elapsedPeriodsFileName);} } else { // 压缩// 未配置 file 标签if (getParentsRawFileProperty() null) {// 直接压缩归档compressionFuture compressor.asyncCompress(elapsedPeriodsFileName, elapsedPeriodsFileName, elapsedPeriodStem);} else {// 先重命名为 .tmp 文件然后再压缩归档compressionFuture renameRawAndAsyncCompress(elapsedPeriodsFileName, elapsedPeriodStem);}}private void gzCompress(String nameOfFile2gz, String nameOfgzedFile) {// 源文件可能是 .log 也可能是 .log.tmp 文件File file2gz new File(nameOfFile2gz);if (!file2gz.exists()) {return;}// 目标压缩文件if (!nameOfgzedFile.endsWith(.gz)) {nameOfgzedFile nameOfgzedFile .gz;}File gzedFile new File(nameOfgzedFile);// 如果目标文件已存在则直接返回不同版本写法略有不同但大同小异// 此处多进程或实例同时操作时可能出现后边执行归档操作的进程直接 return未执行删除逻辑if (gzedFile.exists()) {return;}...... BufferedInputStream bis null;GZIPOutputStream gzos null;try {bis new BufferedInputStream(new FileInputStream(nameOfFile2gz));gzos new GZIPOutputStream(new FileOutputStream(nameOfgzedFile));......// 如果源文件存在则删除if (!file2gz.delete()) {addStatus(new WarnStatus(Could not delete [ nameOfFile2gz ]., this));}} catch (Exception e) {...... } finally {...... }}解决办法
不压缩直接归档原始日志文件不存在此问题压缩不使用 file 标签可以跳过 .tmp 文件创建逻辑