Promtail 配置
概述
参考:
promtail.yaml 配置文件详解
Promtail 在 YAML 文件(通常称为 config.yaml)中进行配置,该文件包含 Promtail 运行时信息,抓取到的日志存储位置,以及抓取日志的行为
顶级字段
- global(global) # 影响所有目标的全局设置。
- server(server) # 配置 promtail 程序运行时行为。如指定监听的ip、port等信息。
- clients(clients) # 配置 Promtail 如何连接到 Loki 的多个实例,并向每个实例发送日志。- Note:如果其中一台远程Loki服务器无法响应或发生任何可重试的错误,这将影响将日志发送到任何其他已配置的远程Loki服务器。
- 发送是在单个线程上完成的! 如果要发送到多个远程Loki实例,通常建议并行运行多个Promtail客户端。
 
- positions(positions) # positions 文件用于记录 Promtail 发现的目标。该字段用于定义如何保存 postitions.yaml 文件。- Promtail 发现的目标就是指日志文件。
 
- scrape_configs(scrape_configs) # 配置 Promtail 如何发现日志文件,以及如何从这些日志文件抓取日志。
- limits_config(limits_config) # 为 Promtail 配置全局的限制功能
- target_config(target_config) # Configures how tailed targets will be watched.
- options(options_config) # Configures additional promtail configurations
- tracing(tracing_config) # Configures tracing support
server
clients
positions
positions 文件用于记录 Promtail 发现的目标。该字段用于定义如何保存 postitions.yaml 文件。Promtail 发现的目标就是指日志文件。
filename(STRING) # 指定 positions 文件路径。默认值:/var/log/positions.yaml
sync_period(DURATION) # 更新 positions 文件的时间间隔。默认值:10s
ignore_invalid_yaml(BOOLEAN) # Whether to ignore & later overwrite positions files that are corrupted。默认值:false
scrape_configs(占比最大的字段)
参考:
Promtail 根据 scrape_configs 字段的内容,使用指定的发现方法从一系列目标中抓取日志。
基本配置
job_name(STRING) # 指定抓取日志的 Job 名字
pipeline_stages(pipeline_stages) # 定义从目标抓取日志的行为。默认值:docker{}。
loki_push_api(loki_push_api_config) # 定义日志推送的路径 (e.g. from other Promtails or the Docker Logging Driver)
Scrape 目标配置
Promtail 会根据这里的字段的配置,以发现需要 Scrape 日志的目标,有两种方式来发现目标:静态 与 动态
static_configs([]static_configs) # 静态配置。直接指定需要抓去 Metrics 的 Targets。
- 具体配置详见下文静态目标发现
XX_sd_configs(OBJECT) # 动态配置
- 具体配置详见下文动态目标发现
journal(journal) # 动态配置
- 具体配置详见下文动态目标发现
syslog(syslog) # 动态配置
- 具体配置详见下文动态目标发现
Relabel 配置
relabel_configs([]relabel_configs) # 为本 Job 下抓取日志的过程定义 Relabeling 行为。与 Prometheus 的 Relabeling 行为一致
- 具体配置详见下文重设标签
配置文件中的通用配置字段
静态目标发现
static_configs
targets([]STRING) # 指定要抓取 metrics 的 targets 的 IP:PORT
- HOST
labels(map[STRING]STRING) # 指定该 targets 的标签,可以随意添加任意多个。
这个字段与 Prometheus 的配置有一点区别。Promtail 中必须要添加 __path__ 这个键,以指定要抓去日志的文件路径。
- KEY: VAL # 比如该键值可以是 run: httpd,标签名是 run,run 的值是 httpd,key 与 val 使用字母,数字,_,-,.这几个字符且以字母或数字开头;val 可以为空。
- ……
配置示例
- job_name: system
  pipeline_stages:
  static_configs:
    - targets: # 指定抓取目标,i.e.抓取哪台设备上的文件
        - localhost
      labels: # 指定该日志流的标签
        job: varlogs # 指定一个标签,至少需要一个非 __ 开头的标签,这样才能为日志流定义唯一标识符,否则日志流没有名字。
        __path__: /var/log/host/* # 指定抓取路径,该匹配标识抓取 /var/log/host 目录下的所有文件。注意:不包含子目录下的文件。
动态目标发现
我们可以从 grafana/loki 项目代码 clients/pkg/promtail/scrapeconfig/scrapeconfig.go 中找到所有可以动态发现目标的配置。
journal(OBJECT)
在具有 systemd 的 Linux 系统上,Loki 可以通过 journal 程序获取日志。
# 从 Journal 获取的日志保留所有原始字段,并将这些信息转变为 JSON 格式。默认值:false
json: <BOOLEAN>
# 当 Promtail 启动时,从 Journal 日志文件中,获取的最老时间的日志。默认值:7h
# 比如值为7h的话,则 Promatail 于 17:00 启动,则会抓取 10:00 到 17:00 之间的日志内容
max_age: <DURATION>
# 为本次通过 Journal 日志文件采集日志的任务添加标签。
labels:
  <LabelName>: <LabelValue>
  ......
# 获取 Journal 日志文件的路径。默认值:/var/log/journal 和 /run/log/journal
path: <STRING>
注意:由于 Journal 程序存储日志的路径问题,所以我们我们在容器中运行 Promtail 时,必须挂载相关路径,否则 Promtail 读取不到 Journal 生成的日志。比如可以通过下面的 docker 命令运行
/run/log/journal 一般不用挂载,大部分系统都不适用这个目录了,虽然 Journal 还是会处理该目录~
docker run \
  -v /var/log/journal/:/var/log/journal/ \
  -v /run/log/journal/:/run/log/journal/ \
  -v /etc/machine-id:/etc/machine-id \
  grafana/promtail:latest
下面是 journal 自动发现日志流后,自动发现的标签。
    __journal__audit_loginuid
    __journal__audit_session
    __journal__boot_id
    __journal__cap_effective
    __journal__cmdline
    __journal__comm
    __journal__exe
    __journal__gid
    __journal__hostname # 主机名
    __journal__machine_id
    __journal__pid
    __journal__selinux_context
    __journal__source_realtime_timestamp
    __journal__stream_id
    __journal__systemd_cgroup
    __journal__systemd_invocation_id
    __journal__systemd_slice
    __journal__systemd_unit
    __journal__transport
    __journal__uid
    __journal_code_file
    __journal_code_func
    __journal_code_line
    __journal_cpu_usage_nsec
    __journal_invocation_id
    __journal_message
    __journal_message_id
    __journal_priority
    __journal_priority_keyword
    __journal_syslog_facility
    __journal_syslog_identifier
    __journal_syslog_pid
    __journal_syslog_timestamp
    __journal_unit # 该标签是 unit 的名称,标签值是所有 .service,比如 ssh.service、dockerd.service 等等
json 字段说明
这是开启的样子:

这是关闭的样子:

可以看见,Parsed Fields 中,多出来很多字段。json 字段开启后,除了正常的 Message,还有很多关于该日志消息的属性。
配置示例
- job_name: systemd-journal
  journal:
    labels:
      job: systemd-journal
  relabel_configs:
    - action: labelmap
      regex: __(journal__systemd_unit)
    - action: labelmap
      regex: __(journal__hostname)
    - action: drop
      source_labels: [journal__systemd_unit]
      regex: session-.*scope
kubernetes_sd_configs([]Object)
https://grafana.com/docs/loki/latest/clients/promtail/configuration/#kubernetes_sd_config
与 Prometheus 中的 kubernetes 的服务发现机制基本一致。与 Prometheus 配置的不同点在于,Promtail 的 kubernetes 服务发现配置一般都会使用 Relabeling 机制弄出来一个 __path__ 标签
具体字段内容详见《Prometheus Server 配置》文章中 kubernetes_sd_configs 章节
配置示例
- job_name: kubernetes-pods
  pipeline_stages:
    - docker: {}
  kubernetes_sd_configs:
    - role: pod
  relabel_configs:
    # 为日志流配标签
    - source_labels: [__meta_kubernetes_namespace]
      action: replace
      target_label: namespace
      # 为日志流配置标签
    - source_labels: [__meta_kubernetes_pod_name]
      action: replace
      target_label: pod_name
      # 配置抓取日志的路径
    - source_labels:
        - __meta_kubernetes_pod_annotation_kubernetes_io_config_mirror
        - __meta_kubernetes_pod_container_name
      separator: /
      regex: (.*)
      replacement: /var/log/pods/*$1/*.log
      target_label: __path__
这里有一个注意事项,最后的一段,则是比 Prometheus 多出来的部分,因为 Promtail 必须需要一个 path 字段来获取采集日志的路径。
docker_sd_configs([]Object)
https://grafana.com/docs/loki/latest/clients/promtail/configuration/#docker_sd_config
host(STRING) # Docker 守护进程的地址。通常设置为:unix:///var/run/docker.sock
filters([]Object) # 过滤器,用于过滤发现的容器。只有满足条件的容器的日志,才会被 Promtail 采集并上报。
可用的过滤器取决于上游 Docker 的 API:https://docs.docker.com/engine/api/v1.41/#operation/ContainerList,在这个链接中,可以从 Available filters 部分看到,等号左边就是 name 字段,等号右边就是 values 字段。
这个 name 与 values 的用法就像
docker ps命令中的--filter标志,这个标志所使用的过滤器,也是符合 Docker API 中的 ContainerList。
- name(STRING) #
- values([]STRING) #
refresh_interval(DURATION) # 刷新间隔。每隔 refresh_interval 时间,从 Docker 的守护进程发现一次可以采集日志的容器。
配置示例
- job_name: flog_scrape
  docker_sd_configs:
    - host: unix:///var/run/docker.sock
      refresh_interval: 60s
  relabel_configs:
    - source_labels: ["__meta_docker_container_name"]
      regex: "/(.*)"
      target_label: "container"
重设标签
relabel_configs
pipeline_stages
具体配置详见 Pipeline 笔记以查看 Pipeline 功能,在 Stages(阶段) 详解 笔记查看具体配置字段。
配置文件示例
采集 Docker 容器日志
server:
  http_listen_port: 9080
  grpc_listen_port: 0
positions:
  filename: /tmp/positions.yaml
clients:
  - url: http://gateway:3100/loki/api/v1/push
    tenant_id: tenant1
scrape_configs:
  - job_name: flog_scrape
    docker_sd_configs:
      - host: unix:///var/run/docker.sock
        refresh_interval: 5s
    relabel_configs:
      - source_labels: ["__meta_docker_container_name"]
        regex: "/(.*)"
        target_label: "container"
反馈
此页是否对你有帮助?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.