# 日志服务

开发者可通过微信云开发提供的日志服务实现日志采集和检索分析等功能，方便开发者通过日志快速的发现和定位问题。每条日志可最长存储 30 天，超过 30 天的日志将被自动清理。

### 运行环境

- 下载并安装 1.02.1910242 或以上版本的开发者工具，[下载地址](/miniprogram/dev/devtools/download.md)。
- wx-server-sdk 需使用 1.5.0 或以上版本。

### 开启服务

开发者可前往微信开发者工具云控制台的云函数高级日志界面开启高级日志服务。

![开启服务](https://res8.wxqcloud.qq.com.cn/wxdoc/df448d6a-f6b5-436d-a3be-9d9cf3d8a4b2.png)
- 说明：日志服务将在基础套餐外进行额外收费，请查看 [计费说明](../../billing/price#%E6%8C%89%E9%87%8F%E4%BB%98%E8%B4%B9)

### 关闭服务

开发者可前往「微信云开发者工具 - 云开发控制台 - 云函数 - 高级日志页面」，点击「关闭日志」即可。
![image](https://res.wx.qq.com/op_res/5ZM72qK2BZczER961sVo_AxH3mbcjhfrS8SQemIAVmNyTqZbrN5tUOr8kQAe-a8Af7h1Uq7wx0SdGVtjJ_PXiQ)

- 说明：关闭日志后，将会删除原有的日志数据，并且再次开启后不可恢复。

### 日志采集

可使用 `wx-server-sdk` 提供的 [`logger`](/minigame/dev/wxcloud/reference-sdk-api/utils/Cloud.logger) 方法打日志：
1. 通过 `logger()` 方法取得 `log` 对象
2. 调用 `log` 对象上的 `log` / `info` / `warn` / `error` （对应不同 level 的日志等级）方法，传入一个对象作为参数，每调用一次会产生一条日志记录
3. 对象的每一个 `<key, value>` 对都会成为日志一条记录中的一个可检索的键值对，其中 `value` 不论值是什么都会被转成字符串

注意：`logger()` 必须在 `exports.main` 中执行，否则不会生效。

示例：

```js
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV,
})
// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()

  const log = cloud.logger()
  log.info({
    name: 'xx',
    cost: 10,
    attributes: {
      width: 100,
      height: 200,
    },
    colors: ['red', 'blue'],
  })

  // 输出到日志记录中会有这么一条记录：
  // {
  //   "level": "info",
  //   "name": "xx",
  //   "cost": "10",
  //   "attributes": "{ width: 100, height: 200 }",
  //   "colors": "[ "red", "blue" ]"
  //   ..., // 其他系统字段
  // }

  return {
    event,
    openid: wxContext.OPENID,
    appid: wxContext.APPID,
    unionid: wxContext.UNIONID,
  }
}
```

### 日志检索

开启日志服务后，开发者可在高级日志界面进行日志检索。

#### 1. 检索方式

切换时间、排序方式及输入相应检索字段均可触发日志检索。由于每条日志最长保存 30 天，因此从当前日期算起，时间选择不得超过 30 天。

![日志检索](https://res8.wxqcloud.qq.com.cn/wxdoc/f4913a4f-e59b-41f7-a067-a94e3cce5452.png)

为了方便开发者进行日志检索，系统还提供了以下便捷操作：

- 在检索结果中，提取了 `level`、`function` 和 `requestId` 做为关键字，通过点击相应字段可实现以该字段为检索条件进行检索。

![快速查询](https://res8.wxqcloud.qq.com.cn/wxdoc/ac819e6d-282e-4c93-8e90-4c6015084f4b.png)

- 记录了最近 3 条检索记录，供开发者快速回溯操作。

![快速查询](https://res8.wxqcloud.qq.com.cn/wxdoc/31307ba5-fb44-4070-a5e9-673d3f7c24d3.png)

- 将`level`、`function`、`src` 和 `requestId` 作为快捷查询短语，通过点击相应字段可实现在检索输入框中的快速填充对应内容。

#### 2. 查询方法

通过输入查询语句可以自定义检索条件，实现更加强大的检索需求。

在日志服务中，原始日志文本将根据分词符分成多个关键词且大小写敏感，默认分词符为 `!@#%^&*()_="', <>/?|\;:\n\t\r[]{}`。

以某条日志内容为例：

```
10002345987;write;ERROR;code=400;topic does not exist;
```

上述日志内容中 `;`，`=` 两个默认分词符会将日志内容切分成 6 个单词 `10002345987`，`write`，`ERROR`，`code`，`400`，`topic does not exist`，开发者可以通过任意单词精准检索。

日志检索支持以下检索方式：

- 全文检索：输入关键词精准检索日志。也支持模糊关键字匹配（`?`、`*`）。如：`warn`、`wa?n`。
- 键值检索：日志内容以 JSON 对象格式返回，开发者可以使用 `key:value` 的形式检索日志。其中 key 作为可以自定义输出的日志内容对象的属性字段，value 则为日志内容（也支持模糊关键字匹配）。如：`level:warn`、`function:echo`。

日志检索支持以下查询语法：

语法 | 语义
--- | ---
key:value | 键值搜索格式，需要开启配置 键值索引，其中 value 支持?、*模糊搜索，若 key 或者 value 中包含空格、冒号等关键字符，需要用引号包括。例如 "error level":high
A and B | 「与」逻辑，返回 A 与 B 的交集结果，若多个关键词，使用空格分割则默认为 and
A or B | 「或」逻辑，返回 A 或 B 的并集结果
not B | 「非」逻辑，返回不包含 B 的结果
A not B | 「减」逻辑，返回符合 A 但不符合 B 的结果，即 A-B
( ) | 合并两个或多个 query 为一个 query，主要用于控制运算优先级
'a' | 字符 a 将被视为普通字符，不会当作语法关键词处理
"A" | A 中的所有关键词都将被视为普通字符，不会当作语法关键词处理
\ | 转义字符，转义后的字符表示符号本身，例如转义引号\"，转义冒号\:等
* | 模糊查询关键字，匹配零个、单个或多个任意字符，不支持开头*，例如：输入 abc*，会返回以 abc 开头的所有命中日志
? | 模糊查询关键字，特定位置匹配单个字符。例如，输入 ab?c，会返回以 ab 为开头，以 c 为结尾字符，且两者之间且有一个字符的所有命中日志
