栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java > SpringBoot

Spring Boot 日志处理篇

SpringBoot 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Boot 日志处理篇

本文简介

前篇侧重 Log4j2 的配置,本篇侧重统一日志处理的应用,以下包含 HTTP 请求的日志处理、Exception 异常日志处理。

HTTP 请求日志

1、明确日志记录的内容

示例:用户、IP地址、Method、URI、请求参数、请求体

2、全局拦截 MDCFilter.java

package com.anoyi.config.server;import lombok.extern.log4j.Log4j2;import org.slf4j.MDC;import org.springframework.http.HttpMethod;import org.springframework.stereotype.Component;import org.springframework.web.filter.OncePerRequestFilter;import javax.servlet.FilterChain;import javax.servlet.ReadListener;import javax.servlet.ServletException;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import javax.servlet.http.HttpServletResponse;import java.io.*;@Component@Log4j2public class MDCFilter extends OncePerRequestFilter {    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {        try {
            MDC.put("user", request.getRemoteUser());
            String query = request.getQueryString() != null ? "?" + request.getQueryString() : "";            if (request.getMethod().equals(HttpMethod.POST.name())) {
                MultiReadHttpServletRequest multiReadHttpServletRequest = new MultiReadHttpServletRequest(request);
                log.info("IP:{}, Method:{}, URI:{} Body:{}", request.getRemoteAddr(), request.getMethod(), request.getRequestURI() + query, multiReadHttpServletRequest.getRequestBody());
                chain.doFilter(multiReadHttpServletRequest, response);
            } else {
                log.info("IP:{}, Method:{}, URI:{}", request.getRemoteAddr(), request.getMethod(), request.getRequestURI() + query);
                chain.doFilter(request, response);
            }
        } finally {
            MDC.clear();
        }
    }    
    class MultiReadHttpServletRequest extends HttpServletRequestWrapper {        // 缓存 RequestBody
        private String requestBody;

        MultiReadHttpServletRequest(HttpServletRequest request) {            super(request);
            requestBody = "";            try {
                StringBuilder stringBuilder = new StringBuilder();
                InputStream inputStream = request.getInputStream();                byte[] bs = new byte[1024];                int len;                while ((len = inputStream.read(bs)) != -1) {
                    stringBuilder.append(new String(bs, 0, len));
                }
                requestBody = stringBuilder.toString();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }        @Override
        public ServletInputStream getInputStream() throws IOException {            final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(requestBody.getBytes());            return new ServletInputStream() {                public int read() throws IOException {                    return byteArrayInputStream.read();
                }                @Override
                public boolean isFinished() {                    return byteArrayInputStream.available() == 0;
                }                @Override
                public boolean isReady() {                    return true;
                }                @Override
                public void setReadListener(ReadListener readListener) {

                }
            };
        }        @Override
        public BufferedReader getReader() throws IOException {            return new BufferedReader(new InputStreamReader(this.getInputStream()));
        }        String getRequestBody() {            return requestBody.replaceAll("n", "");
        }
    }

}

3、配置日志 Pattern

logging:
  pattern:    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%15.15t] %-40.40c{1.} [%X{user}] : %m%n%xwEx"

说明: MDC.put("user", request.getRemoteUser()); => %X{user}

Exception 异常日志

1、全局异常处理 ExceptionController.java

package com.anoyi.controller;import com.anoyi.bean.ResponseBean;import lombok.AllArgsConstructor;import lombok.extern.log4j.Log4j2;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice@Log4j2
@AllArgsConstructor
public class ExceptionController {    
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResponseBean handleException(Exception exception){        log.error(exception.getMessage(), exception);        return ResponseBean.error(exception);
    }

}



作者:Anoyi
链接:https://www.jianshu.com/p/c883b86c34fa


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/235806.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号