场景:处理多行日志(Java)
febbweiss/java-log-generator – Docker Image | Docker Hub
grafana – Promtail error pipeline stage must only contain one key – Stack Overflow
promtail multiline Code Example
第一步、更新 Promtail 配置:
...
- job_name: kubernetes-pods
pipeline_stages:
- cri: {}
# 通过 firstline 匹配多行日志开始
- multiline:
firstline: ^(\d{2})-(\d{2})-(\d{4}) (\d{2}):(\d{2}):(\d{2})
max_lines: 128
max_wait_time: 3s
...
第二步、创建能够产生多行日志的容器,以用于测试:kubectl apply -f ./promtail-testing.yaml
第三步、最后,在 Grafan 中,观察 Java 日志是否被合并为单条日志记录;
Q:那么多日志,如果下一行是未匹配 firstline 的常规日志会怎样(两行日志具有不同格式)?
A:我们实在查看日志平台时产生的该疑问。实质上,同个日志文件,它的日志行是相同格式,如果下一行不匹配这种模式,则为视为多行日志。如果一个日志文件中具有多种日志格式行,则需要修改软件的设计,保持相同的日志格式;
场景 | 抓取 systemd journal 日志
Grafana Loki documentation/Scraping/Journal Scraping (Linux Only)
Loki tutorial: How to send logs from EKS with Promtail to get full visibility in Grafana | Grafana Labs
该笔记将记录:如何通过 Promtail 抓取 systemd journal 日志,以及相关问题的解决办法。
补充说明:我们通过 Helm 部署 Promtail 实例,所以如下配置内容与 Helm Chart 具有相关性(但其他部署方式的配置思路也是相似的)
第一步、修改 Promtail 配置
修改 Helm Chart values.yaml 文件:
挂载系统日志目录
...
extraVolumes:
- name: journal
hostPath:
path: /var/log/journal
...
extraVolumeMounts:
- name: journal
mountPath: /var/log/journal
readOnly: true
...
配置日志文件抓取
extraScrapeConfigs: |
...
- job_name: systemd-journal
journal:
labels:
job: systemd-journal
path: /var/log/journal
max_age: 12h
relabel_configs:
- source_labels:
- __journal__systemd_unit
target_label: systemd_unit
- source_labels:
- __journal__hostname
target_label: hostname
- source_labels:
- __journal_syslog_identifier
target_label: syslog_identifier
...
第二步、增加 Dashboard 配置
我们没有找到满足需求的 Dashboard 配置,所以我们创建简单的 Dashboard 配置:
Variable:
1)loki_datasource:
2)hostname: label_values(hostname)
3)systemd_unit: label_values({hostname=~”$hostname”}, systemd_unit)
4)search: Text box
Pannel
1)Log browser: {hostname=”$hostname”,systemd_unit=”$systemd_unit”} |~ “(?i)$search”