parent
077751021e
commit
3b598b0e81
9 changed files with 347 additions and 6 deletions
@ -0,0 +1,120 @@ |
||||
package cn.soul2.jyjc.admin.filter; |
||||
|
||||
import lombok.SneakyThrows; |
||||
|
||||
import javax.servlet.ServletOutputStream; |
||||
import javax.servlet.WriteListener; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import javax.servlet.http.HttpServletResponseWrapper; |
||||
import java.io.*; |
||||
|
||||
/** |
||||
* @author Soul2 |
||||
* @description 包装ServletResponse, 照抄自 <a href="https://blog.csdn.net/temp_44/article/details/107762290">temp_44</a> |
||||
* @date 2024-04-15 |
||||
*/ |
||||
public class Soul2ResponseWrapper extends HttpServletResponseWrapper { |
||||
private ByteArrayOutputStream buffer = null; |
||||
private ServletOutputStream out = null; |
||||
private PrintWriter writer = null; |
||||
|
||||
public Soul2ResponseWrapper(HttpServletResponse resp) throws IOException { |
||||
super(resp); |
||||
// 真正存储数据的流
|
||||
buffer = new ByteArrayOutputStream(); |
||||
out = new WapperedOutputStream(buffer); |
||||
writer = new PrintWriter(new OutputStreamWriter(buffer, |
||||
this.getCharacterEncoding())); |
||||
} |
||||
|
||||
/** |
||||
* 重载父类获取outputstream的方法 |
||||
*/ |
||||
@Override |
||||
public ServletOutputStream getOutputStream() throws IOException { |
||||
return out; |
||||
} |
||||
|
||||
/** |
||||
* 重载父类获取writer的方法 |
||||
*/ |
||||
@Override |
||||
public PrintWriter getWriter() throws UnsupportedEncodingException { |
||||
return writer; |
||||
} |
||||
|
||||
/** |
||||
* The default behavior of this method is to call |
||||
* setCharacterEncoding(String charset) on the wrapped response object. |
||||
* |
||||
* @param charset |
||||
* @since 2.4 |
||||
*/ |
||||
@SneakyThrows |
||||
@Override |
||||
public void setCharacterEncoding(String charset) { |
||||
super.setCharacterEncoding(charset); |
||||
writer = new PrintWriter(new OutputStreamWriter(buffer, |
||||
this.getCharacterEncoding())); |
||||
} |
||||
|
||||
/** |
||||
* 重载父类获取flushBuffer的方法 |
||||
*/ |
||||
@Override |
||||
public void flushBuffer() throws IOException { |
||||
if (out != null) { |
||||
out.flush(); |
||||
} |
||||
if (writer != null) { |
||||
writer.flush(); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void reset() { |
||||
buffer.reset(); |
||||
} |
||||
|
||||
/** |
||||
* 将out、writer中的数据强制输出到WapperedResponse的buffer里面,否则取不到数据 |
||||
*/ |
||||
public byte[] getResponseData() throws IOException { |
||||
flushBuffer(); |
||||
return buffer.toByteArray(); |
||||
} |
||||
|
||||
/** |
||||
* 内部类,对ServletOutputStream进行包装 |
||||
*/ |
||||
private class WapperedOutputStream extends ServletOutputStream { |
||||
private ByteArrayOutputStream bos = null; |
||||
|
||||
public WapperedOutputStream(ByteArrayOutputStream stream) |
||||
throws IOException { |
||||
bos = stream; |
||||
} |
||||
|
||||
@Override |
||||
public void write(int b) throws IOException { |
||||
bos.write(b); |
||||
} |
||||
|
||||
@Override |
||||
public void write(byte[] b) throws IOException { |
||||
bos.write(b, 0, b.length); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isReady() { |
||||
// TODO Auto-generated method stub
|
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void setWriteListener(WriteListener writeListener) { |
||||
// TODO Auto-generated method stub
|
||||
|
||||
} |
||||
} |
||||
} |
@ -0,0 +1,127 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<configuration scan="true" scanPeriod="10 seconds"> |
||||
|
||||
<!--<include resource="org/springframework/boot/logging/logback/base.xml" />--> |
||||
|
||||
<contextName>logback</contextName> |
||||
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 --> |
||||
<!-- <property name="log.path" value=".logs/"/>--> |
||||
<springProperty scope="context" name="log.path" source="logging.path" defaultValue="./logs/"/> |
||||
<property name="log.pattern" |
||||
value="%cyan(%d{HH:mm:ss}) %green(%-5level) %blue(%logger{50}) - %boldMagenta(%msg) \t\t ---- %yellow([%thread] %d{yyyy-MM-dd HH:mm:ss.SSS}) %n" |
||||
/> |
||||
<property name="debug.path" value="${log.path}/%d{yyyyMM,aux}/%d{dd,aux}/debug-%d{yyyyMMdd}.%i.log.gz"/> |
||||
<property name="info.path" value="${log.path}/%d{yyyyMM,aux}/%d{dd,aux}/info-%d{yyyyMMdd}.%i.log.gz"/> |
||||
<property name="error.path" value="${log.path}/%d{yyyyMM,aux}/%d{dd,aux}/error-%d{yyyyMMdd}.%i.log.gz"/> |
||||
|
||||
<!--输出到控制台--> |
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> |
||||
<!-- 控制台输出的日志级别是大于或等于此级别的日志信息 --> |
||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> |
||||
<level>DEBUG</level> |
||||
</filter> |
||||
<!--日志文件输出格式与字符集--> |
||||
<encoder> |
||||
<Pattern>${log.pattern}</Pattern> |
||||
<charset>UTF-8</charset> |
||||
</encoder> |
||||
</appender> |
||||
|
||||
<!--输出到文件--> |
||||
<!-- 时间滚动输出 level为 DEBUG 日志 --> |
||||
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
||||
<!-- 正在记录的日志文件的路径及文件名 --> |
||||
<file>${log.path}/debug.log</file> |
||||
<!--日志文件输出格式与字符集--> |
||||
<encoder> |
||||
<pattern>${log.pattern}</pattern> |
||||
<charset>UTF-8</charset> |
||||
</encoder> |
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 --> |
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
||||
<!-- 日志归档 --> |
||||
<fileNamePattern>${debug.path}</fileNamePattern> |
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> |
||||
<maxFileSize>10MB</maxFileSize> |
||||
</timeBasedFileNamingAndTriggeringPolicy> |
||||
<!--日志文件保留天数--> |
||||
<maxHistory>7</maxHistory> |
||||
</rollingPolicy> |
||||
<!-- 此日志文件记录debug级别以上的 --> |
||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> |
||||
<level>DEBUG</level> |
||||
</filter> |
||||
</appender> |
||||
|
||||
<!-- 时间滚动输出 level为 INFO 日志 --> |
||||
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
||||
<!-- 正在记录的日志文件的路径及文件名 --> |
||||
<file>${log.path}/info.log</file> |
||||
<!--日志文件输出格式--> |
||||
<encoder> |
||||
<pattern>${log.pattern}</pattern> |
||||
<charset>UTF-8</charset> |
||||
</encoder> |
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 --> |
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
||||
<!-- 每天日志归档路径以及格式 --> |
||||
<fileNamePattern>${info.path}</fileNamePattern> |
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> |
||||
<maxFileSize>100MB</maxFileSize> |
||||
</timeBasedFileNamingAndTriggeringPolicy> |
||||
<!--日志文件保留天数--> |
||||
<maxHistory>60</maxHistory> |
||||
</rollingPolicy> |
||||
<!-- 此日志文件记录info级别以上的 --> |
||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> |
||||
<level>INFO</level> |
||||
</filter> |
||||
</appender> |
||||
|
||||
<!-- 时间滚动输出 level为 ERROR 日志 --> |
||||
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
||||
<!-- 正在记录的日志文件的路径及文件名 --> |
||||
<file>${log.path}/error.log</file> |
||||
<!--日志文件输出格式--> |
||||
<encoder> |
||||
<pattern>${log.pattern}</pattern> |
||||
<charset>UTF-8</charset> <!-- 此处设置字符集 --> |
||||
</encoder> |
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 --> |
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
||||
<fileNamePattern>${error.path}</fileNamePattern> |
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> |
||||
<maxFileSize>10MB</maxFileSize> |
||||
</timeBasedFileNamingAndTriggeringPolicy> |
||||
<!--日志文件保留天数--> |
||||
<maxHistory>60</maxHistory> |
||||
</rollingPolicy> |
||||
<!-- 此日志文件记录error级别以上的 --> |
||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> |
||||
<level>ERROR</level> |
||||
</filter> |
||||
</appender> |
||||
|
||||
<!--开发环境:打印控制台--> |
||||
<springProfile name="local,dev,test"> |
||||
<logger level="DEBUG" additivity="false" name="cn.soul2"> |
||||
<appender-ref ref="CONSOLE"/> |
||||
<appender-ref ref="DEBUG_FILE"/> |
||||
<appender-ref ref="INFO_FILE"/> |
||||
<appender-ref ref="ERROR_FILE"/> |
||||
</logger> |
||||
<root level="INFO"> |
||||
<appender-ref ref="CONSOLE"/> |
||||
<appender-ref ref="INFO_FILE"/> |
||||
<appender-ref ref="ERROR_FILE"/> |
||||
</root> |
||||
</springProfile> |
||||
|
||||
<!--生产环境:输出到文件--> |
||||
<springProfile name="pre,prod,prod-yun"> |
||||
<root level="INFO"> |
||||
<appender-ref ref="INFO_FILE"/> |
||||
<appender-ref ref="ERROR_FILE"/> |
||||
</root> |
||||
</springProfile> |
||||
</configuration> |
Loading…
Reference in new issue