4

I'm having some challenges with coercing my log lines in a certain format.

I'm running one promtail instance on several log files, of which some are logfmt and others are free-form.

My objective is to transform the free-form ones to the same logfmt as the others, independent of any other labeling. That means the actual payload (log line) pushed to my qryn instance is then supposed to have the same format, and I woudn't even be able to "see" the original, free-form log line downstream. This should enable me to use a simple | logfmt in grafana, regardless of the log source.

I tried in several ways, but I can't get the log line replaced, i.e. while I can extract to labels in all ways conceivable, I can't replace the actual log line.

A (slightly redacted) promtail-config.yml:

server:
  disable: true

positions:
  filename: ${RUNDIR}/.logs/positions.yaml

clients:
  - url: http://mylocalqryn:33100/loki/api/v1/push
    batchwait: 5s
    timeout: 30s

scrape_configs:

- job_name: consolidated-logs

  # https://grafana.com/docs/loki/latest/clients/promtail/pipelines/
  # https://grafana.com/docs/loki/latest/clients/promtail/stages/template/
  pipeline_stages:
  - match:
      selector: '{ Program="freeformlog" }'
      stages:
      - regex:
          expression: '^(?P<time>^[0-9-:TZ.+]*)\s+(?P<level>[A-z]*)\s+(?P<Function>[0-9A-z:.]*)\s+(?P<msg>.*$)'
      - timestamp:
          format: RFC3339
          source: time
      - template:
          source: level
          template: '{{ ToLower .Value }}'
      - labels:
          level:
          msg:
          Function:
      - replace:
          expression: '.*'
          replace: 'time="{{ .timestamp }}" level="{{ .level }}" msg="{{ .msg }}" Host="{{ .Host }}" Program="{{ .Program }}" Function="{{ .Function }}"'

  static_configs:
  - targets:
    - localhost
    labels:
      Host: ${HOST:-"_host-unknown_"}
      Program: logfmtcompat
      __path__: ${RUNDIR}/.logs/logfmtcompat.log
  - targets:
    - localhost
    labels:
      Host: ${HOST:-"_host-unknown_"}
      Program: freeformlog
      __path__: ${RUNDIR}/.logs/freeformlog.log
ppenguin
  • 155
  • 1
  • 11

1 Answers1

0

Stumbled on the same problem. It seems that replace only replaces things on captured regexp groups, not matched ones. The solution for your case is:

      - replace:
          expression: '(.*)'
fserb
  • 4,004
  • 2
  • 26
  • 23