0
点赞
收藏
分享

微信扫一扫

Loki使用示例:针对部署在K8s中的Java应用的日志捕获Promtail配置示例


在Kubernetes(K8s)环境中,Promtail通常通过DaemonSet部署以自动为集群中的每个节点上的Pod捕获日志。以下是一个针对部署在K8s中的Java应用的日志捕获配置示例:

# promtail-config.yaml
server:
  http_listen_port: 9080

positions:
  filename: /tmp/promtail_positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push

scrape_configs:
  - job_name: kubernetes-pods
    kubernetes_sd_configs:
      - role: pod # 从Kubernetes获取Pods的信息
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_promtail_io_scrape] # 检查是否有标注为promtail.io/scrape=true的注解
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_pod_annotation_promtail_io_path] # 获取指定的日志路径注解
        target_label: __path__
        replacement: /var/log/pods/${__meta_kubernetes_pod_name}/${__meta_kubernetes_pod_container_name}/stderr.log # 替换为默认的日志文件路径
        action: replace
      - source_labels: [__meta_kubernetes_pod_name, __meta_kubernetes_pod_namespace] # 添加labels以便在Loki中区分来源
        separator: /
        target_label: k8s_app
      - source_labels: [__meta_kubernetes_pod_container_name]
        target_label: container
    pipeline_stages:
      - match:
          selector: '{container="java"}' # 如果是Java应用的日志容器
        stages:
          - regex:
              expression: '^(\w+\s+\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3})\s+(.+)$' # 解析Java应用典型的日志格式
              fields: ['timestamp', 'message'] # 匹配时间和消息字段

在这个配置中:

  • Promtail通过Kubernetes服务发现(kubernetes_sd_configs)自动找到集群中的Pod。
  • relabel_configs 部分用于筛选那些具有promtail.io/scrape: "true"注解的Pod,并从Pod的日志路径读取日志。
  • pipeline_stages 是一个可选配置,用于在发送日志到Loki前对其进行预处理,如正则表达式解析,这里举例的是针对常见的Java应用日志格式。

在实际部署时,需要确保在Kubernetes Pod的模板(Deployment、StatefulSet等)中添加适当的注解来指示Promtail抓取其日志,例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-java-app
spec:
  template:
    metadata:
      annotations:
        promtail.io/scrape: "true"
        promtail.io/path: "/logs/my-java-app.log" # 如果Java应用的日志不是默认路径,则在此指定
    ...

最后,将Promtail通过DaemonSet部署到Kubernetes集群,并挂载配置文件和必要的日志目录:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: promtail
spec:
  selector:
    matchLabels:
      app: promtail
  template:
    metadata:
      labels:
        app: promtail
    spec:
      serviceAccountName: promtail # 需要有足够的权限读取Pod日志
      containers:
      - name: promtail
        image: grafana/promtail:vX.Y.Z # 使用适当的Promtail镜像版本
        volumeMounts:
        - name: config-volume
          mountPath: /etc/promtail/
          readOnly: true
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      volumes:
      - name: config-volume
        configMap:
          name: promtail-config
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

请确保替换以上示例中的实际镜像版本号 (vX.Y.Z) 以及适配您实际环境的日志路径和注解。同时,需要创建一个名为 promtail-config 的ConfigMap来包含Promtail的配置文件。


举报

相关推荐

0 条评论