coding喵
2019-03-06 16:57:49
springboot 配置日志
记录项目统一配置日志:
copy logback.xml到resources目录下
更改logback.xml要输出的日志文件的名字:
<configuration scan="true" scanPeriod="10 seconds">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<property name="LOG_PATH" value="log"/>
<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_PATH}/项目名.log</File>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/项目名-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>500MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>2</maxHistory>
</rollingPolicy>
</appender>
<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<File>${LOG_PATH}/项目名_error.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/项目名-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>500MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>2</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<logger name="org.springframework.web" level="INFO"/>
<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
<logger name="com.jk" level="DEBUG"/>
<!--<logger name="org.mybatis">-->
<!--<level value="TRACE"/>-->
<!--</logger>-->
<root level="info">
<appender-ref ref="INFO_FILE"/>
<appender-ref ref="ERROR_FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
在properties文件中配置日志:
logging.path=*******log //不重要 logging.config=classpath:logback.xml
到此,日志基本上已配置完成,
在接口中可以手动打印日志:
public static Logger logger = LoggerFactory.getLogger(Utils.class); logger.info();//在需要记录的地方使用 logger.error();
也可以自动打印日志,主要打印接口的入参和出参:
首先在启动类上加上如下注解:
@ServletComponentScan
copy过滤器及其附属文件:
package *********;
import ***********HttpHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter
public class PostFilter implements Filter {
private final static Logger logger = LoggerFactory.getLogger(PostFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 打印请求参数日志
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// pushBlockQueue.start();
HttpServletRequest request = (HttpServletRequest) servletRequest;
request.setCharacterEncoding("utf-8");
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setContentType("application/json;charset=UTF-8");
HttpServletRequest requestWrapper = new BodyRequestWrapper(request);
String body = "";
String method = requestWrapper.getMethod();
if(method.equals("POST")){
body = HttpHelper.getBodyString(requestWrapper);
body = body.replaceAll(" ", "");
body = body.replaceAll("\t", "");
body = body.replaceAll("\r", "");
body = body.replaceAll("\n", "");
}else{
body = HttpHelper.getGetString(requestWrapper);
}
String requestHeader = HttpHelper.getHeaderString(requestWrapper);
String requestUri = requestWrapper.getRequestURI();
logger.info("requestUri:{}" , requestUri);
logger.info("requestParams:{}" ,body);
logger.info("requestHeader:{}",requestHeader);
filterChain.doFilter(requestWrapper, response);
}
@Override
public void destroy() {
}
}
package *****************;
import *********.HttpHelper;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class BodyRequestWrapper extends HttpServletRequestWrapper {
private final byte[] body;
public BodyRequestWrapper(HttpServletRequest request) {
super(request);
body = HttpHelper.getBodyString(request).getBytes(Charset.forName("UTF-8"));
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais = new ByteArrayInputStream(body);
return new ServletInputStream() {
@Override
public int read() throws IOException {
return bais.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
};
}
}
package *************;
import com.alibaba.fastjson.JSONArray;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
public class HttpHelper {
public static String getBodyString(ServletRequest request) {
StringBuilder sb = new StringBuilder();
InputStream inputStream = null;
BufferedReader reader = null;
try {
inputStream = request.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
String line = "";
while ((line = reader.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
public static String getGetString(ServletRequest request){
Map map = request.getParameterMap();
String params = JSONArray.toJSONString(map);
return params;
}
public static String getHeaderString(HttpServletRequest request){
Map<String, String> map = new HashMap<String, String>();
Enumeration headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement();
String value = request.getHeader(key);
map.put(key, value);
}
String params = JSONArray.toJSONString(map);
return params;
}
}
日志自动打印结果:
可以打印已经配置的发起请求的url和请求参数,以及返回数据。
以上某些文件均由某java大佬编写。
期待指正和补充。
评论



最近浏览
