应用集成BWAF框架日志打印实践

本文介绍应用集成BWAF框架日志打印,以及BWAF日志不打印的排查办法。

BWAF打印链路日志介绍

BWAF的logging包负责打印规范化的日志,记录应用服务、商业能力、扩展点等关键组件的调用情况,作为运营平台运行时数据的来源。

链路日志的格式定义及相关说明,示例代码如下:

${Timestamp} ${SeverityText} [${TraceId}] [${SpanId}] [${Thread}] ${Logger} ${TenantID} ${AppID} [${Resource(k1:v1,k2:v2,...,kn:vn)}] [${Attributes(k1:v1,k2:v2,...,kn:vn)}] ${Body}

相关属性说明如下:

  • Timestamp:时间戳,例如:2021-05-13 14:38:58.195,000000纳秒

  • SeverityText:日志级别,例如:TRACE/DEBUG/INFO/WARN/ERROR/FATAL

  • TraceId:Trace标识

  • SpanId:Span标识

  • Thread:线程标识

  • Logger:日志记录者

  • TenantID:租户ID

  • AppID@Version:应用ID@应用版本

    例如:tradecenter@1.2.1,表示ID为tradecenter的应用,版本为1.2.1,即当前这条日志是tradecenter应用的1.2.1版本打印出来的。

  • Resource:资源(组)包含若干二级Resource(每个二级Resource都有可能为空),逗号分隔的KV(也可以双冒号分隔KV),顺序不固定,内容包括:

    Span链路相关信息:| (竖线)分隔。

    • spanctx:`${parentSpanId}|${spanLatency}`

      • parentSpanId:父span的spanId。

      • spanLatency:当前span花费的时间。

        例如:spanctx::0axxxxxxx|203,意思是,父span的ID是0axxxxxxx,当前span用时203毫秒。

    其他:

    • hostname:主机名

    • ip:IP地址

    • tz:时区

    • logver:日志格式版本

    • ……

    hostname::HaiqiangdeMacBook-Pro.local,tz::Asia/Shanghai,ip::127.0.0.1,logver::202209140915.rc,spanctx::6855dbf9ab1b6bfa|13
  • Attributes:属性(组)包含若干属性(每个Attribute都有可能为空),逗号分隔的KV(也可以双冒号分隔KV),顺序不固定,内容包括:

    • bizid:业务身份,请求中台服务的前台业务的身份标识,通过HTTP header(x-bw-biz-id)传递到中台中心应用上下文中。

    • bizappid:业务应用标识,请求中台服务的前台业务应用标识,通过HTTP header(x-bw-biz-app-id)传递到中台中心应用上下文中。

    • bizcapsvc:商业能力服务唯一标识。

    • appsvc:应用服务唯一标识。

    • dmnsvc:领域服务唯一标识。

    • bizext:扩展点唯一标识。

    • bizextimpl:扩展点实现编码。

    此外,商业能力API(bizcapsvc)、应用服务(appsvc)、领域服务(dmnsvc)对应到Java代码层面都是接口/类,具体的方法,与下面svcmethod(服务方法)字段配合来表达:

    • svcmethod:服务方法。

    • svccallrstcode:调用结果编码,仅在svc调用结束的日志中存在。大于0或非数字的值代表调用成功,值本身是返回码;0代表调用失败。

    • svccallrstmsg:调用结果信息,仅在svc调用结束的日志中存在,调用成功时该字段可能不存在(调用成功,没有需要反馈的信息)。主要用于记录调用失败(svccallrstcode=0)时,具体的错误信息,例如:Timeout、业务异常等。

    例如:

    商业能力API bizcapsvc::alibaba.aliyun.bizworks.pbc.api.OrderCapAPI。

    商业能力API的方法svcmethod:placeOrder。

    表达商业能力API OrderCapAPI的placeOrder方法。

  • Body:不限定内容。

BWAF日志不打印的排查办法

您可以参考以下步骤逐步排查:

  1. 检查应用是否依赖了BWAF logging包,即确认运行时是否加载了BWAF logging的JAR包。

    <dependency>
      <groupId>com.alibaba.bizworks</groupId>
      <artifactId>bwaf-core-traffic-logging</artifactId>
      <version>${BWAF.version}</version>
    </dependency>
  2. 确认启动日志中是否包含BWAF logging核心引擎初始化的日志。在应用启动日志中搜索如下内容:

    BWAF logging/tracing is working with 
  3. 确认应用中是否使用了继承org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupportbean。如果是的话,需要手工将BWAF loggingInterceptor加入进来。示例代码如下:

    import com.alibaba.bizworks.traffic.logging.interceptor.TracingInterceptor;
    
    @Configuration
    public class SpringMvcConfiguration extends WebMvcConfigurationSupport {
    
        @Autowired
    	private TracingInterceptor tracingInterceptor;
        
        @Override
        protected void addInterceptors(InterceptorRegistry registry) {
            ...
            ...
            registry.addInterceptor(tracingInterceptor);
            super.addInterceptors(registry);
        }
    }