Могу ли я сгруппировать HTTP-журналы Apache с балансировкой нагрузки на сервере журналов rsyslog с помощью VirtualHost?

У меня есть массив серверов приложений с балансировкой нагрузки (app1-app4) для нескольких веб-сайтов, ведущих журналы на один сервер журналов (log1). . Я хотел бы, чтобы журналы на сервере журналов были сгруппированы по виртуальному хосту , чтобы я мог получить отдельные журналы для каждого виртуального хоста.

В настоящее время мой apache отправляет журналы на мой сервер rsyslog с VirutalHost в качестве ведущего поля, например:

LogFormat "%V %h %l %{USERID}e %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" \"%{Cookie}n\""  combinedcookie
CustomLog "|/usr/bin/logger --size 8192 -t httpd -p local6.info" combinedcookie

Создает объединенные локальные журналы на каждом сервере приложений, например:

www.example.com 190.120.94.32 - - [19/Jun/2020:14:47:05 -0400] "GET /help/ HTTP/1.1" 200 6621 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36" "*cookie*"
fubar.pro 177.27.44.23 - guest [19/Jun/2020:14:52:06 -0400] "GET /login HTTP/1.1" 200 6746 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36" "*cookie*"
www.yadayada.ca 176.82.169.235 - user [19/Jun/2020:14:55:04 -0400] "GET / HTTP/1.1" 200 5716 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36" "*cookie*"

Сервер журналов rsyslog.conf выглядит так:

$template HttpdTmp,"/backup1/logs/www/%HOSTNAME%/%$YEAR%/live_access_log-%$YEAR%%$MONTH%%$DAY%"
$template RawMsgFormat,"%msg:2:4096%\n"
local6.*                -?HttpdTmp;RawMsgFormat

Что создает такие журналы:

/backup1/logs/www/app1/2020/live_access_log-20200619
/backup1/logs/www/app2/2020/live_access_log-20200619
/backup1/logs/www/app3/2020/live_access_log-20200619
/backup1/logs/www/app4/2020/live_access_log-20200619

Что я хотел бына сервере журналов:

/backup1/logs/www/www.example.com/2020/live_access_log-20200619
/backup1/logs/www/fubar.pro/2020/live_access_log-20200619
/backup1/logs/www/yadayada.ca/2020/live_access_log-20200619

Есть ли какая-то волшебная конфигурация, которую можно выполнить с помощью тегов rsyslog или подобных? Или я могу разделить на основе первого слова в журнале (имя VirtualHost)?

(*IP-адреса рандомизированы для защиты анонимности)

1
29.06.2020, 17:08
1 ответ

Предполагая, что строка www.example.comнаходится в начале свойства msg, вы хотите заменить %HOSTNAME%в шаблоне имени файла этим значением. Вероятно, самая простая операция замены свойства состоит в извлечении поля , разделенного пробелом. Это имеет вид

%key:F,delimeter:numfield:options%

где разделителем является десятичный код символа, т. е. 32 для пробела, а поля начинаются с 1 для первого. Поскольку кажется, что у вас есть пробел в начале msg, вам может потребоваться выбрать второе поле и использовать:

%msg:F,32:2%

Итак, для вашего примера сервер журналов rsyslog.conf будет выглядеть так:

$template SiteTmp,"/backup1/logs/www/%msg:F,32:2%/%$YEAR%/live_access_log-%$YEAR%%$MONTH%%$DAY%"
$template RawMsgFormat,"%msg:2:4096%\n"
local6.*                -?SiteTmp;RawMsgFormat
1
18.03.2021, 23:26

Теги

Похожие вопросы