06.4静态标签vs动态标签

分类: Grafana Loki日志管理

静态标签 vs 动态标签

标签是 Loki 的核心概念,用于组织和查询日志。本节将学习:静态标签配置、从日志提取动态标签、以及正则表达式的使用。

静态标签

静态标签是什么? 静态标签是固定的标签值。值固定不变,所有日志共享,配置简单,适合全局属性。

静态标签有什么特点呢?

  • 值固定不变。 静态标签的值在配置时确定,不会改变。例如
    environment: production
  • 所有日志共享。 同一个配置中的所有日志都使用相同的静态标签。
  • 配置简单。 直接在配置文件中指定。不需要复杂的处理。
  • 适合全局属性。 适合标识环境、区域、服务等全局属性。

配置示例: 在 scrape_configs 中配置静态标签,例如

job: app
environment: production
region: 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 格式的日志,提取字段作为标签,例如

level
service
user_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+)\.log
,提取:
service=app, instance=service-1

第二个示例:从日志内容提取。 日志:

2024-01-15 10:00:00 level=ERROR service=api
,正则表达式:
level=(?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 查询语言。学习如何查询日志。