Настройка логирования access логов Nginx в Google Big Query с помощью Fluentd

Решил перевести логи Nginx’а в Google BQ. Сначала хотел перенести в Elastic, но лень было поднимать сервер, а Big Query уже готов. Вот, как это делается на Debian.

Инструкция подходит и для Ubuntu, CentOS (используйте соответствующий менеджер пакетов).

Для этого нам понадобится:

  1. root SSH доступ к серверу
  2. Созданный проект и датасет в Google BQ
  3. Созданный сервисный аккаунт и JSON-ключ (файл) к нему

Логинимся на сервер, обновляем информацию о пакетах, ставим sudo (если еще не устанавливали)

# apt update
# apt install sudo

Ставим td-agent, команды для разных ОС вы найдете по ссылке.

В моем случае это:

# curl -fsSL https://toolbelt.treasuredata.com/sh/install-debian-buster-td-agent4.sh | sh

Далее запускаем и проверяем работоспособность:

# sudo systemctl start td-agent.service
# sudo systemctl status td-agent.service

Если видим подобное сообщение, значит все ОК:

● td-agent.service - td-agent: Fluentd based data collector for Treasure Data
   Loaded: loaded (/lib/systemd/system/td-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2022-08-10 08:06:06 CEST; 39s ago
     Docs: https://docs.treasuredata.com/display/public/PD/About+Treasure+Data%27s+Server-Side+Agent
  Process: 29000 ExecStart=/opt/td-agent/bin/fluentd --log $TD_AGENT_LOG_FILE --daemon /var/run/td-agent/td-agent.pid $TD_AGENT_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 29099 (fluentd)
    Tasks: 9 (limit: 4915)
   Memory: 77.0M
   CGroup: /system.slice/td-agent.service
           ├─29099 /opt/td-agent/bin/ruby /opt/td-agent/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
           └─29102 /opt/td-agent/bin/ruby -Eascii-8bit:ascii-8bit /opt/td-agent/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid --under-supervisor

Aug 10 08:06:05 vmi382323.contaboserver.net systemd[1]: Starting td-agent: Fluentd based data collector for Treasure Data...
Aug 10 08:06:06 vmi3823.server.net systemd[1]: Started td-agent: Fluentd based data collector for Treasure Data.

Следующим этапом ставим плагин для работы с Google Big Query — fluent-plugin-bigquery:

# sudo td-agent-gem install fluent-plugin-bigquery

Может занять некоторое время. У меня «зависает» на этапе «Parsing documentation for google-api-client-0.53.0», но на самом деле нужно просто подождать.

Настраиваем Nginx

После чего я меняю формат access лога для более удобного распаршивания. В nginx.conf (вы должны знать где он лежит) я привожу access log к виду:

log_format ltsv "time:$time_local"
                "\tvhost:$host"
                "\treq:$request"
                "\tstatus:$status"
                "\tremote_addr:$remote_addr"
                "\tforwardedfor:$http_x_forwarded_for"
                "\tua:$http_user_agent"
                "\treferer:$http_referer"
                "\tsize:$body_bytes_sent"
                "\treqtime:$request_time"
                "\tremoteuser:$remote_user";

access_log /var/log/nginx/access.log ltsv;

И делаю reload nginx:

# nginx -s reload

TD-agent будет парсить файл /var/log/nginx/access.log и стримить его в таблицу в BQ.

Настраиваем Td-agent

Все настройки будем производить в файле /etc/td-agent/td-agent.conf. Таблицу сами создавать не будем, а сделаем так, чтобы она создавалась автоматически.

Обнуляем файл /etc/td-agent/td-agent.conf:

# cp /dev/null /etc/td-agent/td-agent.conf

Теперь открываем этот же файл в удобном редакторе и пишем:

<source>
  @type tail
  tag accesslog
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/nginx.pos
  format ltsv
  time_format %d/%b/%Y:%H:%M:%S %z
</source>

<match accesslog>
  @type bigquery_insert
  auth_method json_key
  email {EMAIL}
  json_key {KEY_FILE}

  project {PROJECT}
  dataset {DATASET}
  tables {TABLE}
  auto_create_table true
  schema [{"name":"time","type":"STRING"},{"name":"vhost","type":"STRING"},{"name":"req","type":"STRING"},{"name":"status","type":"STRING"},{"name":"remote_addr","type":"STRING"},{"name":"forwardedfor","type":"STRING"},{"name":"ua","type":"STRING"},{"name":"referer","type":"STRING"},{"name":"size","type":"STRING"},{"name":"reqtime","type":"STRING"},{"name":"remoteuser","type":"STRING"}]

<inject>
  time_key time
  time_type string
  time_format %Y-%m-%d %H:%M:%S
</inject>
<buffer>
    flush_interval 0.1  # flush as frequent as possible

    total_limit_size 10g

    flush_thread_count 16
  </buffer>
</match>

Где:

  1. {EMAIL} — почта сервисного аккаунта
  2. {KEY_FILE} — путь до файла с ключом от сервисного аккаунта (json файл)
  3. {PROJECT} — название проекта в BQ
  4. {DATASET} — название датасета
  5. {TABLE} — название создаваемой таблицы

И перезапускаем td-agent:

# systemctl restart td-agent

Логи можно смотреть в файле /var/log/td-agent/td-agent.log

#Updated 3.10.2022

Если трафика много, то таблица нереально разрастается и стоимость запросов для анализа будет довольно высока. Я нашел 2 варианта, что можно сделать:

  1. Использовать в настройках td-agent опцию для выгрузки в партиционные таблицы, но тогда вы не будете видеть данные реалтайм
  2. Написать 2 скрипта (что сделал я): первый выгружает данные за вчера в партиционную таблицу, а второй скрипт удаляет устаревшие данные из стримминговой таблицы. Задание работает раз в сутки.

Добавить комментарий

Ваш адрес email не будет опубликован.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.