Хранение логов в БД

После анализа логов их необходимо куда-то структурированно сохранить (какую-то базу). Для хранения логов в БД для начала нужно выбрать в какую СУБД. При этом существует, опять же, целая масса вариантов.

Немного поразмыслив я решил использовать ClickHouse. Судя по обзорам достаточно быстрая (не зря же yandex ее создавали как раз для хранения большого объема и обработки аналитики). Можно было бы выбрать тот же PostgreSQL, MySQL (MariaDB), Elasticsearch… В общем все что угодно, но я остановился на этом варианте.

Установка

Для установки обращаемся к официальной документации и выполняем следующие команды:


sudo apt-get install -y apt-transport-https ca-certificates dirmngr
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754

echo "deb https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list
sudo apt-get update
sudo apt-get install -y clickhouse-server clickhouse-client
sudo service clickhouse-server start
clickhouse-client

Так как я это все разворачиваю на Debian, то и способ установки выбираю соответствующий. Вообще ничего сложного.

После установки рекомендую настроить сервер: установить пароль и настроить использование ресурсов (если нужно). Все это есть в документации.

Так же можно посмотреть в сторону какого-нибудь UI для удобства работы. Что-то конкретно рекомендовать не буду, так как в поисковике должно много чего найтись.

Структура

Для начала нужно создать саму базу:


CREATE DATABASE IF NOT EXISTS logs

Теперь создадим таблицы в БД. Для логов Nginx:


CREATE TABLE IF NOT EXISTS logs.nginx (
time DateTime,
dt_syslog String,
server String,
programm String,
remote String,
host String,
user String,
method String,
path String,
proto String,
code UInt16,
size UInt32,
referer String,
agent String,
http_x_forwarded_for String
)
ENGINE = ReplacingMergeTree() PARTITION BY (toDate(time), server, programm)
ORDER BY (time, server, programm, size)
TTL time + toIntervalMonth(6)
SETTINGS index_granularity = 8192;

Далее таблица для Postfix:


CREATE TABLE IF NOT EXISTS logs.postfix (
time DateTime,
server String,
daemon String,
process String,
process_id String,
connect_to_host String,
connect_to_ip String,
port UInt16,
status String,
connect_from String,
connect_ip_from String,
disconnect_from String,
disconnect_ip_from String,
ehlo Int16,
starttls Int16,
mail Int16,
rcpt Int16,
data Int32,
quit Int16,
commands Int16,
lost_conn_host String,
lost_conn_ip String,
queue_id String,
removed String,
client String,
client_ip String,
message_id String,
to String,
orig_to String,
relay_host String,
relay_ip String,
delay Float64,
delays String,
dsn String,
description String,
from String,
size UInt32,
nrcpt UInt16
)
ENGINE = ReplacingMergeTree() PARTITION BY (toDate(time), server, daemon, process)
ORDER BY (time, server, daemon, process, queue_id, message_id)
TTL time + toIntervalMonth(6)
SETTINGS index_granularity = 8192;

И в заключении таблица для Squid:


CREATE TABLE IF NOT EXISTS logs.squid (
dt DateTime,
millis UInt16,
server String,
processTime UInt32,
ipClient String,
statusName String,
statusCode UInt16,
size UInt32,
method String,
url String,
domain String,
authName String,
proxyResult String,
proxyAddress String,
contentType String
) ENGINE = ReplacingMergeTree() PARTITION BY toDate(dt)
ORDER BY (dt, millis, server)
TTL time + toIntervalMonth(6)
SETTINGS index_granularity = 8192;

Для всех таблиц используется параметр TTL, который учитывается при оптимизации таблиц. В данном случае в таблицу «можно» вставлять дублирующие строки, но чтобы от них избавиться в запросе после названия таблицы, нужно вставить FINAL, ну и, соответственно, при оптимизации так же дублирующие строки должны быть удалены. Признак дублирования строк основывается на параметре ORDER BY для «движка» ReplacingMergeTree.

Обслуживание

Для обслуживания (уменьшения дублирующих строк) я использую следующий скрипт:


#!/bin/bash

LOGIN=login
PASSWORD=password
HOST=address
echo "OPTIMIZE TABLE logs.squid FINAL DEDUPLICATE" | clickhouse-client -u $LOGIN --password $PASSWORD --host $HOST
echo "OPTIMIZE TABLE logs.nginx FINAL DEDUPLICATE" | clickhouse-client -u $LOGIN --password $PASSWORD --host $HOST
echo "OPTIMIZE TABLE logs.postfix FINAL DEDUPLICATE" | clickhouse-client -u $LOGIN --password $PASSWORD --host $HOST

Ну и закинуть «сие чудо» в планировщик.

Заключение

Далее можно переходить к поиску информации уже непосредственно в БД.

Поделиться
Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий

Вы должны быть авторизованы, чтобы разместить комментарий.