
# access日志
#### 实现原理
devspore-http-log打印access日志是使用servlet过滤器的方式来实现的，过滤器名称：DevsporeHttpLogFilter。
#### 使用方式
1. pom文件添加如下依赖： 
   ```
   <dependency>
       <groupId>com.huaweicloud.devspore</groupId>
       <artifactId>devspore-http-log</artifactId>
       <version>最新版本</version> 
   </dependency>
   ```
   
   
2. 在spring配置文件中添加配置项：devspore.http-log.service-name={your service name}。
3. 当引入devspore-http-log组件后会自动打印access日志，无需做其他改动。 
   如不想打印access日志可通过配置文件设置devspore.http-log.access.enable=false来关闭access日志。
   
   
 
#### 自定义扩展字段
access日志中除打印的固定字段外，用户还可以打印自定义字段。自定义字段的添加方式有如下三种：
- 以kv形式逐个添加。
  用户可在业务代码中使用devspore-http-log提供的静态方法来添加想要扩展的自定义字段。
  ```
  // 1、testkey为打印在access日志中的自定义字段名称， testval为自定义字段的值
  // 2、该段代码可以加在接口中的任意位置，推荐放在service层代码中
  DevsporeHttpLogFilter.addExtraInfo("testkey", "testval");
  ```
  
- 直接添加所有需要添加的信息。
  ```
  // 以下代码可以加在接口中的任意位置，推荐放在service层代码中
  Map<String, Object> extraInfo = new ConcurrentHashMap<>();
  // testkey为打印在access日志中的自定义字段名称， testval为自定义字段的值
  extraInfo.put("testkey","testval");
  DevsporeHttpLogFilter.setExtraInfo(extraInfo);
  ```
  
- 在配置文件中指定请求头或响应头key值，和要打印的字段，http-log会在请求头或响应头获取相应信息。
  ```
  devspore:
    http-log:
      service-name: servicecall
      access:
        custom-fields-from-req:
          user: x-user # key值为日志中打印的字段， value为请求头中的key
          age: x-age # key值为日志中打印的字段， value为请求头中的key
        custom-fields-from-resp:
          userResp: x-user # key值为日志中打印的字段， value为响应头中的key
  ```
  
**注意：通过以上方式添加扩展字段时，如果添加的扩展字段名称和devspore-httplog内置的固定字段名称一致，则会覆盖其默认值。**
#### access日志示例
```
"logType": "access",
"traceId": null,
"nenvId": null,
"method": "GET",
"resBodySize": 93,
"params": null,
"userId": null,
"url": "http://localhost:8081/servicecall/consumer/001",
"duration": 90,
"path": "/consumer/{consumer_id}",
"senvId": null,
"service": "servicecall",
"clientIp": "127.0.0.1",
"appId": null,
"startTime": "2023-12-25 09:33:30.589",
"reqBodySize": -1,
"status": 200
}
```
 #### access日志字段说明
表1access日志字段说明 
| **字段名**         | **字段含义**             | **可选/必选**      | **对应配置参数**                             |
|:---|:---|:---|:---|
| logType         | 日志类型                 | 必选，值固定为 access | 无                                      |
| service         | 微服务名称                | 必选，通过配置文件配置    | devspore.http-log.service-name         |
| serviceAppId    | 微服务的AppID            | 必选，通过配置文件配置    | devspore.http-log.service-app-id       |
| nenvId          | 调用方服务APM环境ID         | 必选             | 无                                      |
| senvId          | Server端APM环境ID       | 必选             | 无                                      |
| url             | 请求URL                | 必选             | 无                                      |
| path            | 请求路径(去参数可聚合统计)       | 必选             | 无                                      |
| method          | 请求HTTP方法             | 必选             | 无                                      |
| params          | 请求参数                 | 可选，默认值为null    | devspore.http-log.params               |
| reqBodySize     | 请求体body大小            | 必选             | 无                                      |
| resBodySize     | 返回体body大小            | 必选             | 无                                      |
| appId           | HIS网关appId           | 必选             | devspore.http-log.app-id-key           |
| status          | 返回状态码                | 必选             | 无                                      |
| traceId         | 调用链跟踪ID              | 必选             | 无                                      |
| startTime       | 请求开始时间               | 必选             | 无                                      |
| duration        | 请求时长                 | 必选             | 无                                      |
| clientIp        | 请求方IP                | 必选             | 无                                      |
| userId          | 请求所属用户ID             | 必选             | 无                                      |
| olcDryRun       | 是否开启olc干跑            | 可选             | devspore.http-log.olc                  |
| olcBlockMsg     | olc限流信息              | 可选             | devspore.http-log.olc                  |
| subToken        | 截断token              | 可选             | devspore.http-log.sub-token            |
| cpuCost         | 当前请求所占用的cpu时间-单位（纳秒） | 可选             | devspore.http-log.access.resource-cost |
| memCost         | 当前请求使用的内存-单位byte     | 可选             | devspore.http-log.access.resource-cost |
| sqlReadRows     | 当前请求共查询了多少行数据库记录     | 可选             | devspore.http-log.access.sql-rows      |
| sqlAffectedRows | 当前请求共影响了多少行数据库记录     | 可选             | devspore.http-log.access.sql-rows      |
   
