шаблон регулярного выражения fluentd не соответствует ошибке для журналов NGINX - PullRequest
0 голосов
/ 07 декабря 2018

Я настроил fluentd для анализа журналов доступа nginx, так как я добавил несколько дополнительных полей в журналы, я не могу использовать формат nginx.Моя конфигурация:

   <source>
    @type tail
    @id service_www_accesslog
    path /var/log/containers/imager-nginx*.log
    pos_file /var/log/imager-nginx-containers.log.pos
    tag influxdb.*
    read_from_head true
    format /(?<host>[^ ]*) \[(?<time>[^\]]*)\] \[Cache:(?<cache>\b\w+\b)\] "(?<CSMethod>\b\w+\b) (?<CSURIStem>(?:\/[A-Za-z0-9$.+!*'(){},~:;=@#%&_\-]*)+) (?<request>.*?)" (?<SCStatus>(?:(?:(?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))))) (?<image_size>(?:(?:(?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))))) "(?<referer>.*?)" "(?<user_agent>.*?)" "(?<xforward>.*?)" (?<request_time>(?:(?:(?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))))) (?<upstream_response>.*?) (?<upstream_connect>.*?) (?<upstream_header>.*)/
    time_format %d/%b/%Y:%H:%M:%S %z
    @log_level debug
  </source>

образец журнала:

10.244.1.0 [07/Dec/2018:16:51:49 +0000] [Cache:MISS] "GET /10e8cd74-94ec-4652-a5c9-d5df1110b9eb/475/400/60/false/blah.jpg HTTP/1.1" 200 60435 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" "172.23.8.123" 0.162 0.160 0.001 0.151

В выводе fluentd я получаю ошибку:

2018-12-07 16:51:50 +0000 [warn]: #0 [service_www_accesslog] pattern not match: "{\"log\":\"10.244.1.0 [07/Dec/2018:16:51:49 +0000] [Cache:MISS] \\\"GET /10e8cd74-94ec-4652-a5c9-d5df1110b9eb/475/400/60/false/blah.jpg HTTP/1.1\\\" 200 60435 \\\"-\\\" \\\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36\\\" \\\"172.23.8.123\\\" 0.162 0.160 0.001 0.151\\n\",\"stream\":\"stdout\",\"time\":\"2018-12-07T16:51:49.224406444Z\"}"

Я протестировалregex, использующий несколько тестеров regex, и он имеет правильный вывод, я также протестировал с использованием Fluentular и использовал вывод для конфигурации.

Я не уверен, куда идти отсюдав отладке этой ошибки.Любая помощь будет оценена

1 Ответ

0 голосов
/ 05 января 2019

Ваше выражение верно.Проблема в том, что вы используете устаревший параметр format .Вместо этого вам нужно будет использовать плагин parser , и есть встроенный парсер nginx , в котором вы можете установить свое выражение.Ниже будет ваш обновленный файл fluent.conf, и он отлично работает при разборе вашего ввода.

<source>
  @type tail
  @id service_www_accesslog
  path /var/log/containers/imager-nginx*.log
  pos_file /var/log/imager-nginx-containers.log.pos
  tag influxdb.*
  read_from_head true
  <parse>
   @type nginx
   expression /(?<host>[^ ]*) \[(?<time>[^\]]*)\] \[Cache:(?<cache>\b\w+\b)\] "(?<CSMethod>\b\w+\b) (?<CSURIStem>(?:\/[A-Za-z0-9$.+!*'(){},~:;=@#%&_\-]*)+) (?<request>.*?)" (?<SCStatus>(?:(?:(?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))))) (?<image_size>(?:(?:(?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))))) "(?<referer>.*?)" "(?<user_agent>.*?)" "(?<xforward>.*?)" (?<request_time>(?:(?:(?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))))) (?<upstream_response>.*?) (?<upstream_connect>.*?) (?<upstream_header>.*)/
   time_format %d/%b/%Y:%H:%M:%S %z
  </parse>
  @log_level debug
</source>
...