首页 > 其他 > 详细

Logger

时间:2019-07-04 20:01:41      阅读:125      评论:0      收藏:0      [点我收藏+]
CREATE TABLE [dbo].[SWEBSERVICELOG](
	[WLG_ID] [varchar](100) NOT NULL,
	[WLG_SESSIONID] [varchar](100) NULL,
	[WLG_REMOTEIPADDR] [varchar](20) NULL,
	[WLG_REQUESTURL] [varchar](100) NULL,
	[WLG_START_DT] [datetime2](7) NULL,
	[WLG_END_DT] [datetime2](7) NULL,
	[WLG_CLIENTHOST] [varchar](200) NULL,
	[WLG_USERAGENT] [varchar](500) NULL,
	[WLG_METHOD] [nvarchar](20) NULL,
	[WLG_PARAMS] [varchar](500) NULL,
	[WLG_PARAMSVALUE] [varchar](4000) NULL,
	[WLG_RETURN_MSG] [text] NULL,
	[WLG_EXCEPTION] [varchar](500) NULL,
	[WLG_CREATION_DT] [datetime] NULL,
	[WLG_UPDATE_DT] [datetime] NULL,
	[WLG_CREATIONUID] [varchar](50) NULL,
	[WLG_UPDATEUID] [varchar](50) NULL,
	[WLG_NAME] [varchar](100) NULL,
	[WLG_RETURN_CODE] [varchar](20) NULL,
	[WLG_RETURN_MESSAGE] [varchar](200) NULL,
	[WLG_SOURCE] [varchar](20) NULL,
 CONSTRAINT [SWEBSERVICELOG_WECHAT_WLG_ID_pk_4] PRIMARY KEY CLUSTERED 
(
	[WLG_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

  

package cn.com.acxiom.coty.wechat.ws.filter;


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.UUID;
import java.util.regex.Pattern;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ReadListener;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.WriteListener;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

import cn.com.acxiom.coty.wechat.ws.bean.po.WebserviceLogWechat;
import cn.com.acxiom.coty.wechat.ws.common.CONST;
import cn.com.acxiom.coty.wechat.ws.common.ResponseBean;
import cn.com.acxiom.coty.wechat.ws.common.UUID16;
import cn.com.acxiom.coty.wechat.ws.mapper.WebserviceLogWechatMapper;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


import org.springframework.util.StringUtils;



@SuppressWarnings("ALL")
@WebFilter
@Component("logFilter")
public class LogFilter implements Filter {


    static InetAddress ia = null;

    static {
        try {
            ia = InetAddress.getLocalHost();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

    private static final Logger logger = LoggerFactory.getLogger(LogFilter.class);
    private static final String NOTLOGIN = "NOT LOGIN";
    private static final String LOGIN_PATH = "/account";

    @Autowired
    private WebserviceLogWechatMapper webLogMapper;

    @Value("${sys.name}")
    private String sysName;

    private Pattern ignore = Pattern.compile(".*/webjars/.*$|.*/v2/.*$|.*/swagger.*$|.*/configuration/.*$|.*/images/.*|.*/farvirate.ico|.*/actuator.*");

    static final Pattern BLANK = Pattern.compile("\\t|\r|\n");

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        long startTime = System.currentTimeMillis();


        /* 判断如果是swagger界面请求的一些资源就不会走日志 */
        HttpServletRequest request = (HttpServletRequest) req;

        if ("option".equalsIgnoreCase(request.getMethod())){
            System.out.println("OPTION");
        }

        HttpServletResponse response = (HttpServletResponse) res;
        String requestId = null;

        if (StringUtils.isEmpty(request.getHeader("sid"))) {
            requestId = UUID.randomUUID().toString().replace("-", "");
            request.setAttribute("sid", requestId);
        } else {
            requestId = request.getHeader("sid");
            request.setAttribute("sid", request.getHeader("sid"));
        }
        response.addHeader("sid", requestId);


        String requestURL = request.getRequestURI();
        if (ignore.matcher(requestURL).matches()) {
            chain.doFilter(req, res);
            return;
        }


        // 2、RequestBody读取
        // 创建包装对象
        LoggerHttpServletRequest wrappedRequest = new LoggerHttpServletRequest(request);
        // 读取参数
        String content = IOUtils.toString(wrappedRequest.getInputStream());
        // 重设参数
        wrappedRequest.resetServletInputStream();
        // 返回输出值
        wrappedRequest.setAttribute("sid", requestId);
        OutputStream outputStream = res.getOutputStream();

        LoggerHttpServletResponse wrapperResponse = new LoggerHttpServletResponse(response);

        chain.doFilter(wrappedRequest, wrapperResponse);

        long endTime = System.currentTimeMillis();
        byte[] responseContent = wrapperResponse.getData();
        String responseContext = null;
        String responseContentType = wrapperResponse.getContentType();
        if (!StringUtils.isEmpty(responseContentType) && responseContentType.contains("image")) {
            responseContext = "[image]";
        } else {
            responseContext = new String(wrapperResponse.getData(), "UTF-8");
        }

        outputStream.write(responseContent);

        /* 插入接口参数捕获日志 */
        try {
            insertWebServiceInvokeLog(wrappedRequest, wrapperResponse, responseContext, content, startTime, endTime, requestId);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


    private void insertWebServiceInvokeLog(LoggerHttpServletRequest wrappedRequest, LoggerHttpServletResponse wrapperResponse, String responseBody, String requestBody, long beginTime,
                                           long endTime, String requestId) {
        String httpMethod = wrappedRequest.getMethod();
        String remoteHost = wrappedRequest.getRemoteHost();
        String params = wrappedRequest.getQueryString();
        String userAgent = wrappedRequest.getHeader("user-agent");
        String requestPath = wrappedRequest.getServletPath();
        String responseContentType = wrapperResponse.getContentType();
        String apiName =wrapperResponse.getHeader(CONST.RESPONS_API_NAME_KEY);


        // 创建系统日志
        WebserviceLogWechat webLog = new WebserviceLogWechat();

        webLog.setWlgId(UUID16.uuid());
        webLog.setWlgCreationuid(sysName);
        webLog.setWlgCreationDt(new Date());
        webLog.setWlgUpdateDt(new Date());
        webLog.setWlgUpdateuid(sysName);
        webLog.setWlgRemoteipaddr(remoteHost);
        webLog.setWlgRequesturl(requestPath);

        webLog.setWlgStartDt(new Date(beginTime));
        webLog.setWlgEndDt(new Date(endTime));
        webLog.setWlgMethod(httpMethod);
        webLog.setWlgName(apiName);
        webLog.setWlgParams(params);
        webLog.setWlgParamsvalue(requestBody);

        webLog.setWlgReturnMsg(responseBody);

        try {
            if (!StringUtils.isEmpty(responseContentType) && !responseContentType.contains("image")) {
                ResponseBean responseBean = JSONObject.parseObject(responseBody, ResponseBean.class);
                webLog.setWlgReturnMessage(responseBean.getMessage());
                webLog.setWlgReturnCode(responseBean.getCode());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


        webLog.setWlgUseragent(userAgent);
        webLog.setWlgClienthost(String.format("%s:%s", ia.getHostName(), ia.getHostAddress()));
        webLog.setWlgSessionid(requestId);
        webLog.setWlgSource(sysName);

        try {
            webLogMapper.insertSelective(webLog);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("requestId:[{}] Save log to db with some error",requestId);
            logger.error("requestId:[{}] Save log to file, Log Data: ",requestId, JSONObject.toJSONString(webLog));
        }


    }


    /**
     * 包装HttpServletRequest
     */
    private static class LoggerHttpServletRequest extends HttpServletRequestWrapper {

        private byte[] data;
        private HttpServletRequest request;
        private LoggerServletInputStream servletInputStream;

        public LoggerHttpServletRequest(HttpServletRequest request) {
            super(request);
            this.request = request;
            servletInputStream = new LoggerServletInputStream();
        }

        public void resetServletInputStream() {
            try {
                servletInputStream.inputStream = new ByteArrayInputStream(new String(data).getBytes("UTF-8"));
            } catch (UnsupportedEncodingException e) {

                logger.error(e.getMessage());

            }
        }

        @Override
        public ServletInputStream getInputStream() throws IOException {
            if (data == null) {
                data = IOUtils.toByteArray(this.request.getReader());
                servletInputStream.inputStream = new ByteArrayInputStream(data);
            }
            return servletInputStream;
        }

        private class LoggerServletInputStream extends ServletInputStream {

            private InputStream inputStream;

            @Override
            public int read() throws IOException {
                return inputStream.read();
            }

            @Override
            public boolean isFinished() {
                return false;
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setReadListener(ReadListener listener) {

            }

        }
    }

    /**
     * 包装的HttpServletResponse类
     *
     * @author jacwan
     */
    private static class LoggerHttpServletResponse extends HttpServletResponseWrapper {

        private ByteArrayOutputStream byteStream;

        public LoggerHttpServletResponse(HttpServletResponse response) {
            super(response);
            byteStream = new ByteArrayOutputStream();
        }

        @Override
        public ServletOutputStream getOutputStream() {
            return new LoggerServletOutputStream(byteStream);
        }

        @Override
        public PrintWriter getWriter() throws IOException {
            return new PrintWriter(getOutputStream(), false);
        }

        public byte[] getData() {
            return byteStream.toByteArray();
        }

        public class LoggerServletOutputStream extends ServletOutputStream {

            private DataOutputStream dataOutputStream;

            public LoggerServletOutputStream(OutputStream output) {
                dataOutputStream = new DataOutputStream(output);
            }

            @Override
            public void write(int b) throws IOException {
                dataOutputStream.write(b);
            }

            @Override
            public void write(byte[] b) throws IOException {
                dataOutputStream.write(b);
            }

            @Override
            public void write(byte[] b, int off, int len) throws IOException {
                dataOutputStream.write(b, off, len);
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setWriteListener(WriteListener listener) {

            }
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

  

Logger

原文:https://www.cnblogs.com/qianjinyan/p/11133940.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!