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大佬编写。
期待指正和补充。
评论