06.4、静态标签vs动态标签
静态标签 vs 动态标签
标签是 Loki 的核心概念,用于组织和查询日志。本节将学习:静态标签配置、从日志提取动态标签、以及正则表达式的使用。
静态标签
静态标签是什么? 静态标签是固定的标签值。值固定不变,所有日志共享,配置简单,适合全局属性。
静态标签有什么特点呢?
- 值固定不变。 静态标签的值在配置时确定,不会改变。例如 。
environment: production - 所有日志共享。 同一个配置中的所有日志都使用相同的静态标签。
- 配置简单。 直接在配置文件中指定。不需要复杂的处理。
- 适合全局属性。 适合标识环境、区域、服务等全局属性。
配置示例: 在 scrape_configs 中配置静态标签,例如
job: appenvironment: productionregion: us-east-1使用场景:
- 环境标识: environment: production、staging、development。
- 区域标识: region: us-east-1、eu-west-1、ap-southeast-1。
- 服务标识: job: app、api、web。
静态标签特点: 静态标签包括固定值(所有日志共享)、配置简单(一次性配置)、适合全局属性(环境/区域/服务)。
静态标签适合标识全局属性。
动态标签
动态标签是什么? 动态标签是从日志内容或文件路径中提取的标签。值动态变化,每个日志可能不同,需要解析提取,适合具体属性。
动态标签有什么提取方式呢?
第一种方式:从文件路径提取。 使用正则表达式从文件路径中提取标签,例如
/var/log/(?P<service>\w+)/(?P<instance>\w+)\.log第二种方式:从日志内容提取(JSON)。 使用 json 阶段解析 JSON 格式的日志,提取字段作为标签,例如
levelserviceuser_id第三种方式:从日志内容提取(正则)。 使用正则表达式从日志内容中提取标签,例如
level=(?P<level>\w+)\s+service=(?P<service>\w+)动态标签特点: 动态标签包括从文件路径提取(服务/实例)、从日志内容提取(JSON/正则),值动态变化(每个日志不同)。
注意事项:
- 标签基数: 避免使用高基数标签(如 user_id)。会导致索引过大。
- 标签值: 标签值应该有限且有意义。例如 level(info/error),而不是 user_id(可能有很多值)。
动态标签适合提取具体属性。
正则表达式使用
正则表达式是什么? 正则表达式是一种用于匹配文本的模式。在 Promtail 中,正则表达式用于从日志内容或文件路径中提取标签。
正则表达式有什么基本语法呢?
- . 匹配任意字符。
- *** 匹配 0 或多个。**
- + 匹配 1 或多个。
- ? 匹配 0 或 1 个。
- \w 匹配字母、数字、下划线。
- \d 匹配数字。
- \s 匹配空白字符。
- (?P<name>...) 命名捕获组。 用于提取标签值。
使用示例:
第一个示例:从文件路径提取。 文件路径:
/var/log/app/service-1.log/var/log/(?P<service>\w+)/(?P<instance>\w+)\.logservice=app, instance=service-1第二个示例:从日志内容提取。 日志:
2024-01-15 10:00:00 level=ERROR service=apilevel=(?P<level>\w+)\s+service=(?P<service>\w+)level=ERROR, service=api第三个示例:复杂正则表达式。 日志:
GET /api/users/123 HTTP/1.1 200(?P<method>\w+)\s+(?P<path>/[^\s]+)\s+HTTP/\d\.\d\s+(?P<status>\d+)method=GET, path=/api/users/123, status=200正则表达式流程: 日志内容/路径 → 正则表达式 → 匹配捕获组 → 提取标签值 → 添加到标签。
掌握正则表达式,可以灵活提取标签。
静态标签 vs 动态标签对比
静态标签和动态标签有什么区别呢?
静态标签: 值固定不变,配置简单,适合全局属性,性能高,灵活性低。例如环境、区域。
动态标签: 值动态变化,配置复杂,适合具体属性,性能中等,灵活性高。例如服务、实例、级别。
什么时候使用静态标签呢?
- 环境标识: production、staging。
- 区域标识: us-east-1、eu-west-1。
- 全局服务标识: app、api、web。
什么时候使用动态标签呢?
- 具体服务名: 从路径提取。
- 实例标识: 从路径提取。
- 日志级别: 从内容提取。
- 状态码: 从内容提取。
什么时候避免动态标签呢?
- 高基数标签: user_id、session_id。会导致索引过大。
- 经常变化的值: 不适合作为标签。
- 无意义的标识符: 不适合作为标签。
标签选择流程: 选择标签类型 → 如果是全局属性,使用静态标签;如果是具体属性且低基数,使用动态标签;如果是高基数,避免使用标签。
选择合适的标签类型,可以让日志系统更高效。
本节小结
在本节中,我们学习了静态标签和动态标签:
第一个是静态标签。 固定值,配置简单,适合全局属性。例如环境、区域、服务。
第二个是动态标签。 动态变化,需要提取,适合具体属性。例如服务、实例、级别。
第三个是正则表达式。 从路径或内容提取标签。掌握正则表达式,可以灵活提取标签。
第四个是标签选择。 根据场景选择合适的标签类型。静态标签适合全局属性,动态标签适合具体属性。
标签总结: 标签类型包括静态标签(固定值/全局属性)和动态标签(动态值/具体属性)。静态标签用于环境/区域/服务,动态标签用于服务/实例/级别。
这就是静态标签和动态标签。掌握标签的配置和使用,可以让日志系统更高效。
在下一节,我们将学习 LogQL 查询语言。学习如何查询日志。