Настройка dockerized fluentd для получения строк журнала из удаленного источника - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь получить dockerized fluentd для получения некоторых строк журнала через tcp. Допускается наличие блока regexp parser внутри fluent.conf для каждого формата строки журнала, чтобы они преобразовывались в текучие форматы time-tag-jsonmsg .

Однако у меня нет доступа к способу создания самих строк журнала. Они могут выглядеть так:

10:26:30 WARNING [PyClass.method:135]: Some text.

Вот то, что я уже пробовал:

В Dockerfile нет ничего особенного:

FROM fluent/fluentd:v1.11-1

# This line is important. Apparently the default user is "fluent". However, root is needed for apk.
# https://github.com/fluent/fluentd-docker-image/issues/21
USER root

RUN apk add --no-cache --update --virtual .build-deps \
        sudo build-base ruby-dev \
 && sudo gem install fluent-plugin-elasticsearch \
 && sudo gem sources --clear-all \
 && apk del .build-deps \
 && rm -rf /tmp/* /var/tmp/* /usr/lib/ruby/gems/*/cache/*.gem

COPY log_fluentd/config/fluent.conf /fluentd/etc/
# COPY log_fluentd/config/entrypoint.sh /bin/  # << Led to trouble but there already is such a file.

# Default port for Forward
EXPOSE 24224
# Default port for TCP
EXPOSE 5170

USER fluent

docker-compose up - копирование этого образа (проект называется p aws) через

  server_fluentd:
    image: paws_server_fluentd:latest
    container_name: server_fluentd
    environment:
      - "FLUENTD_CONF=fluent.conf"
    ports:
      - "24224:24224"
      - "24224:24224/udp"
      - "5170:5170"
    networks:
      - paws
    volumes:
      - "paws_log:/fluentd/log"

Наконец, это соответствующая часть конфигурационного файла, который я создал из того, что я извлек из документации:

<system>
  workers 1
  @log_level info
  root_dir /fluentd/log
</system>

<source>
  @type tcp
  @label @mainstream
  @id pawc
  tag myapp.tcp # required
  port 5170 # defaults to 5170
  bind 0.0.0.0
  # https://docs.fluentd.org/parser/regexp
  <parse>
    @type regexp
    # Example from PAWC log line: "10:26:29 INFO [trifles.config:114]: Some text."
    expression /^(?<logtime>[^\s]+) (?<loglvl>[^\s]+) \[(?<file>[^\]:]+):(?<line>\d+)\]: (?<msg>.*)$/
    time_key logtime
    time_format %H:%M:%S
    types line:integer
  </parse>
</source>

<filter **>
  @type stdout
</filter>

<label @mainstream>
  <match myapp.tcp>
    @type file
    @id output_tcp
    path /fluentd/log/tcp.*.log
    symlink_path /fluentd/log/tcp.log
  </match>
</label>

Это (и скрытый http-материал) привело к этому журналу контейнера:

[info]: parsing config file is succeeded path="/fluentd/etc/fluent.conf"
[info]: gem 'fluent-plugin-elasticsearch' version '4.1.1'
[info]: gem 'fluentd' version '1.11.1'
[warn]: define <match fluent.**> to capture fluentd logs in top level is deprecated. Use <label @FLUENT_LOG> instead
[info]: using configuration file: <ROOT> [.. shortened ..]
[info]: starting fluentd-1.11.1 pid=6 ruby="2.5.8"
[info]: spawn command to main:  cmdline=["/usr/bin/ruby", "-Eascii-8bit:ascii-8bit", "/usr/bin/fluentd", "-c", "/fluentd/etc/fluent.conf", "-p", "/fluentd/plugins", "--under-supervisor"]
[info]: adding match in @mainstream pattern="docker.**" type="file"
[info]: adding match in @mainstream pattern="myapp.tcp" type="file"
[info]: adding match in @mainstream pattern="myapp.access" type="file"
[info]: adding filter pattern="**" type="stdout"
[info]: adding source type="tcp"
[info]: adding source type="http"
[warn]: #0 define <match fluent.**> to capture fluentd logs in top level is deprecated. Use <label @FLUENT_LOG> instead
[info]: #0 starting fluentd worker pid=20 ppid=6 worker=0
[info]: #0 fluentd worker is now running worker=0
  fluent.info: {"pid":20,"ppid":6,"worker":0,"message":"starting fluentd worker pid=20 ppid=6 worker=0"}
[warn]: #0 no patterns matched tag="fluent.info"
  fluent.info: {"worker":0,"message":"fluentd worker is now running worker=0"}
[warn]: #0 no patterns matched tag="fluent.info"

Затем на моем хост-компьютере я запускаю свой python 3.7, говоря:

data_to_send = bytes("10:26:30 WARNING [ServiceBase.subservice:135]: Some text.", 'utf-8')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 5170))
s.sendall(data_to_send)
s.close()

наказывает меня без всякой реакции. По крайней мере, в контейнере есть (пустое) дерево файлов:

/fluentd/log # tree
.
├── http.log -> /fluentd/log/worker0/output_http/buffer/buffer.b5ac49abfabe305660f691eb4d5e782c2.log
└── worker0
    [.. shortened ..]
    └── output_tcp
        └── buffer

13 directories, 3 files [none of them about tcp]

Я подозреваю, что это как-то связано с тегами. Вы видите то, что мне не хватает?

1 Ответ

0 голосов
/ 27 августа 2020

На самом деле все оказалось довольно просто: регулярное выражение хочет, чтобы конец строки \n совпадал с его символом $.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...