У меня есть массив серверов приложений с балансировкой нагрузки (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
Stickley 29 Июн 2020 в 17:08
1
К вашему сведению, регистратору требуется параметр --size> 1024 (по умолчанию), потому что нередки случаи, когда URL-адреса ссылаются на строку журнала, превышающую 1 КБ. убедитесь, что у вас есть последний регистратор, так как поддержка этого параметра появилась недавно в экосистеме RedHat.
 – 
Stickley
29 Июн 2020 в 17:10

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
meuh 23 Июн 2020 в 22:33
Это сработало прямо из коробки. Спасибо!
 – 
Stickley
23 Июн 2020 в 22:26