coding喵的gravatar头像
coding喵 2019-03-06 16:57:49
springboot 配置日志

记录项目统一配置日志:

copy logback.xml到resources目录下

springboot 配置日志

 

更改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;
    }
}

 

日志自动打印结果:

springboot 配置日志可以打印已经配置的发起请求的url和请求参数,以及返回数据。

以上某些文件均由某java大佬编写。

期待指正和补充。


打赏
最近浏览
君知否  LV17 2020年1月17日
故事_sun  LV26 2019年6月5日
最代码酒酒  LV20 2019年4月19日
coding喵  LV16 2019年3月8日
最代码官方  LV167 2019年3月7日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友