API-Server构建指南(3)-日志打印

前面,我们对spring boot 启用Filter 进行了学习与使用。
现在,让我们来使用一些简单的Filter 来完成 请求日志

日志,可以说是API-Server最不可或缺的组件,完整的日志,是错误排查的第一步。在不能线上debug的环境,日志几乎是我们错误排查的唯一途径。

http请求日志,最简单的办法就是在每次请求前,手动打一行日志,看起来比较傻,优点是十分灵活,每个接口都可以按需打印日志,并补充相关信息,日志可读性更强。
比较省时省力的是统一的接口日志,就是将每个请求,在某个统一的地方,打印日志。
这里有三种方式

  1. Filter 日志
    针对request 请求, 使用Servlet 的Filter 用来打印Http 日志 可以说 十分合适。非spring 项目 也可以使用。
public abstract class HttpRequestLogFilter implements Filter {

    
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpUtils.httpRequestLog(request); // 根据request 中的信息 打印 所需 数据
        chain.doFilter(request, resp);
    }
}
  1. Interceptor 日志
    相比于 Filter
    优点是 Interceptor 的生命周期被 spring context 所管理,所以可以使用 spring 中的 bean。
    缺点是,Interceptor 的执行顺序相对靠后,可能存在一些请求在进入 spring 容器前就提前返回了,导致请求无法打印。
    Interceptor 中,可以 借助 spring的强大机制,读取 到 Controller方法上 所使用的 注解,并读取到注解所注解的值,当我们需要对不同Controller方法 进行简单的 区分 处理的时候,这个 机制就可以派上用场,比如我可以通过在 controller 上 添加一个注解,并补充 一些接口简介,在Interceptor 中 便可以读取并打印。
public class HttpRequestLogInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
        HttpUtils.httpRequestLog(req);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        super.afterCompletion(request, response, handler, ex);
    }
}

  1. AOP 日志
    这里,其实也可以 直接使用 强大的 Spring AOP,相对于 前面的 两种依赖 Http请求的日志,
    优点: AOP日志 更为 灵活,同时可以在不是接口调用的 地方(比如业务逻辑处理层) 继续打印日志。还可以结合注解深度定制。完成各种自定义日志。
    缺点: 性能损耗较大,同时丢失了请求 本身的 http相关信息,如 HttpMethod,url,ip 等等信息。
  2. 网关日志
    在打日志这个需求上,其实可以跳出 应用程序本身的限制。一般 网络 请求,在落在我们的服务之前,还会有个网关层,如Kong/Nginx,经过合理的配置,可以通过网关来打印日志,优点是,打印的地点非常早,可以做到不漏任何异常情况,与代码充分解耦,每个项目都不需要去处理http入口日志工作。缺点是不好做一些自定义的个性化的请求日志。每个项目配置不同的日志打印姿势,又失去了网关日志的简单粗暴原则。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • spring官方文档:http://docs.spring.io/spring/docs/current/spri...
    牛马风情阅读 1,754评论 0 3
  • 对于java中的思考的方向,1必须要看前端的页面,对于前端的页面基本的逻辑,如果能理解最好,不理解也要知道几点。 ...
    神尤鲁道夫阅读 843评论 0 0
  • 原文链接:https://docs.spring.io/spring-boot/docs/1.4.x/refere...
    pseudo_niaonao阅读 4,778评论 0 9
  • 本文我们来梳理一下Spring的那些注解,如下图所示,大概从几方面列出了Spring的一些注解: 如果此图看不清楚...
    Java自闭师阅读 743评论 0 1
  • Spring目前的趋势是使用注解结合Java代码而不是配置来定义行为、属性、功能、规则和扩展点,因此梳理注解也是梳...
    墨雨轩夏阅读 1,183评论 0 30