美文网首页
API-Server构建指南(3)-日志打印

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

作者: 东阿 | 来源:发表于2019-12-06 15:55 被阅读0次

前面,我们对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入口日志工作。缺点是不好做一些自定义的个性化的请求日志。每个项目配置不同的日志打印姿势,又失去了网关日志的简单粗暴原则。

相关文章

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

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

  • API-Server构建指南(4)-跨域

    跨域的前世今生系列。核心: 跨域是浏览器的安全策略跨域的具体规则 可参考https://blog.csdn.net...

  • API-Server构建指南(1)-请求格式篇

    一个现代化的生产环境可用的APIServer需要具备什么样的素质?服务端开发人员常被戏称为 CRUDer,被嘲讽就...

  • Xcode 构建优化全指南

    Xcode 构建优化全指南Xcode 构建优化全指南

  • 记录: 日志框架改造落地的一次问题

    现象: win正常打印日志mac不能打印日志,linux某些机器可以打印,换到其他服务器不能打印. 分析: 日志冲...

  • Java 日志系统

    Java 日志系统 1. 创建日志记录器 2. 打印日志信息 3. 日志的级别 由高到底: 可以调整输出日志的级别...

  • kong 自定义插件开发

    1、安装插件 2、kong重新加载插件 3、查看Kong的日志 4、自定义日志打印,并且采集到ELK 5、日志输出...

  • 实现description方法

    调试程序时经常需要打印并查看对象信息,最常用做法就是如下 在构建需要打印到日志的字符串时,object对象会收到d...

  • 2018-07-24

    3D打印的价值不在3D打印在应用 未来,中国3D打印文化博物馆将促进产业在空间上集聚,构建新的产业生态系统。发挥“...

  • 安卓开发之定制自己的日志工具

      定制自己的日志工具,主要是为了控制日志的打印:开发阶段打印日志,正式版本不打印日志。  这很简单,我们新建一个...

网友评论

      本文标题:API-Server构建指南(3)-日志打印

      本文链接:https://www.haomeiwen.com/subject/xlqegctx.html