> For the complete documentation index, see [llms.txt](https://ilogtail.gitbook.io/ilogtail-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ilogtail.gitbook.io/ilogtail-docs/pre-release/plugins/chu-li-cha-jian/kuo-zhan-chu-li-cha-jian/processor-split-key-value.md).

# 键值对

## 简介

`processor_split_key_value processor`插件可以通过切分键值对的方式提取字段。

## 事件能力

列含义见 [概览 · 事件能力列说明](https://ilogtail.gitbook.io/ilogtail-docs/pre-release/plugins/chu-li-cha-jian/kuo-zhan-chu-li-cha-jian/pages/V3l051tHPlzCBkmzOfvu#事件能力列说明)。

| v1 接口 | v2 接口 | Log | Metric | Span |
| ----- | ----- | --- | ------ | ---- |
| ✓     | —     | v1  | 透传未知   | 透传未知 |

## 版本

[Stable](/ilogtail-docs/pre-release/plugins/stability-level.md)

## 版本说明

* 推荐版本：iLogtail v1.5.0 及以上

## 配置参数

| 参数                           | 类型     | 是否必选 | 说明                                                                                                                     |
| ---------------------------- | ------ | ---- | ---------------------------------------------------------------------------------------------------------------------- |
| Type                         | string | 是    | 插件类型。                                                                                                                  |
| SourceKey                    | string | 否    | 原始字段名。                                                                                                                 |
| Delimiter                    | string | 否    | 键值对之间的分隔符。如果未添加该参数，则默认使用制表符\t。                                                                                         |
| Separator                    | string | 否    | 单个键值对中键与值之间的分隔符。如果未添加该参数，则默认使用冒号（:）。                                                                                   |
| KeepSource                   | bool   | 否    | 是否保留原始字段。如果未添加该参数，则默认使用true，表示保留。                                                                                      |
| ErrIfKeyIsEmpty              | bool   | 否    | 当key为空字符串时是否告警。如果未添加该参数，则默认使用true，表示告警。                                                                                |
| EmptyKeyPrefix               | string | 否    | 如果key是空字符串，可通过该参数设置key的前缀，默认为"empty\_key\_"，最终key的格式为前缀+序号，比如"empty\_key\_0"。                                          |
| DiscardWhenSeparatorNotFound | bool   | 否    | 无匹配的原始字段时是否丢弃该键值对。如果未添加该参数，则默认使用false，表示不丢弃。                                                                           |
| NoSeparatorKeyPrefix         | bool   | 否    | 无匹配的原始字段时，如果保留该键值对，可通过该参数设置key的前缀，默认为"no\_separator\_key\_", 最终保存下来的格式为前缀+序号:报错键值对，比如"no\_separator\_key\_0":"报错键值对"   |
| ErrIfSourceKeyNotFound       | bool   | 否    | 无匹配的原始字段时是否告警。如果未添加该参数，则默认使用true，表示告警。                                                                                 |
| ErrIfSeparatorNotFound       | bool   | 否    | 当指定的分隔符（Separator）不存在时是否告警。如果未添加该参数，则默认使用true，表示告警。                                                                    |
| Quote                        | string | 否    | <p>引用符，当设定后若值被引用符包含，就提取引用符内的值。<br>注意引用符若为双引号，需要加转义符\。<br>当引用符内包含\字符与引用连用的情况，作为值的一部分输出。<br>引用符支持多字符。<br>默认不开启引用符功能。</p> |

## 样例

### 切分键值对1

采集`/home/test-log/`路径下的`key_value.log`文件，并按照键值对间分隔符为制表符`\t`，键值对中的分隔符为冒号`:` 的格式进行日志解析。

* 输入

```bash
echo -e 'class:main\tuserid:123456\tmethod:get\tmessage:\"wrong user\"' >> /home/test-log/key_value.log
```

* 采集配置

```yaml
enable: true
inputs:
  - Type: input_file
    FilePaths: 
      - /home/test-log/*.log
processors:
  - Type: processor_split_key_value
    SourceKey: content
    Delimiter: "\t"
    Separator: ":"
flushers:
  - Type: flusher_stdout
    OnlyStdout: true
```

* 输出

```json
{
    "__tag__:__path__": "/home/test_log/key_value.log",
    "class": "main",
    "userid": "123456",
    "method": "get",
    "message": "\"wrong user\"",
    "__time__": "1657354602"
}
```

### 包含引用符的切分键值对

采集`/home/test-log/`路径下的`key_value.log`文件，并按照键值对间分隔符为制表符`\t`，键值对中的分隔符为冒号`:` 的格式进行日志解析。

* 输入

```bash
echo -e 'class:main http_user_agent:"User Agent" "中文" "hello\t\"loongcollector\"\tworld"' >> /home/test-log/key_value.log
```

* 采集配置

```yaml
enable: true
inputs:
  - Type: input_file
    FilePaths: 
      - /home/test-log/*.log
processors:
  - Type: processor_split_key_value
    SourceKey: content
    Delimiter: " "
    Separator: ":"
    Quote: "\""
flushers:
  - Type: flusher_stdout
    OnlyStdout: true
```

* 输出

```json
{
    "__tag__:__path__": "/home/test_log/key_value.log",
    "class": "main",
    "http_user_agent": "User Agent",
    "no_separator_key_0": "中文",
    "no_separator_key_1": "hello\t\"loongcollector\"\tworld",
    "__time__": "1657354602"
}
```

### 包含多字符引用符的切分键值对

采集`/home/test-log/`路径下的`key_value.log`文件，并按照键值对间分隔符为制表符`\t`，键值对中的分隔符为冒号`:` 的格式进行日志解析。

* 输入

```bash
echo -e 'class:main http_user_agent:"""User Agent""" """中文"""' >> /home/test-log/key_value.log
```

* 采集配置

```yaml
enable: true
inputs:
  - Type: input_file
    FilePaths: 
      - /home/test-log/*.log
processors:
  - Type: processor_split_key_value
    SourceKey: content
    Delimiter: " "
    Separator: ":"
    Quote: "\"\"\""
flushers:
  - Type: flusher_stdout
    OnlyStdout: true
```

* 输出

```json
{
    "__tag__:__path__": "/home/test_log/key_value.log",
    "class": "main",
    "http_user_agent": "User Agent",
    "no_separator_key_0": "中文",
    "__time__": "1657354602"
}
```
