Я пытаюсь создать файл конфигурации VirtualHost с подстановочными знаками для apache2, и я не уверен, как обрабатывать ErrorLog
и CustomLog
настройки, чтобы поместить журналы туда, куда я хочу. Как вы можете видеть во втором VirtualHost
, у меня есть журналы в папке logs
в доменах DocumentRoot
. Это отлично работает для статических VirtualHost
s, но как мне это сделать для подстановочного знака VirtualHost
. например, первый VirtualHost
.
NameVirtualHost *:80
# Wild card all subdomains
<VirtualHost *:80>
ServerAlias *.example.com
VirtualDocumentRoot /var/www/%0/public
ErrorLog ?????
CustomLog ????? combined
</VirtualHost>
# Main domain
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public
ErrorLog /var/www/example.com/logs/error.log
CustomLog /var/www/example.com/logs/access.log combined
</VirtualHost>
Я пробовал использовать ErrorLog /var/www/*.example.com/logs/error.log
и ErrorLog / var / www /% 0 / logs / error.log
и то же самое для CustomLog
, но когда я пытаюсь перезапустить apache, он выдает ошибку.
Какой синтаксис мне следует использовать, чтобы получить рабочую версию моего примера ErrorLog
выше?
Я видел подстановочные знаки в виртуальных хостах с динамическими журналами? , но это не так на самом деле то, что мне нужно, так как в конечном итоге все журналы все равно помещаются в один большой файл, а не разделяются на отдельные папки, специфичные для поддоменов.
Рискуя дать вам больше работы, вы также можете подумать о том, чтобы пойти в противоположном направлении и объединить ВСЕ свои файлы журнала в системный журнал
. Это кажется более устрашающим, но это гораздо более эффективное решение. Я больше не заморачиваюсь с отдельными журналами и просто передаю все журналы напрямую в системный журнал (который хранит все в / var / log / messages).
Хотя Apache не делает этого изначально, вы можете добиться этого так ...
LogLevel info
ErrorLog "| /usr/bin/logger -thttpd -plocal6.err"
CustomLog "| /usr/bin/logger -thttpd -plocal6.notice" "%v %h %l %u %t \"%r\" %>s %b"
Системный журнал предоставит вам множество опций, поскольку существует множество служб и утилит, настроенных для его анализа и управления. Мне лично нравится использовать lnav
, вы можете фильтровать, сортировать, искать и т. Д., А интерфейс через ssh окрашен в разные цвета, поэтому легко обнаруживать проблемы. Вы также можете использовать служебные программы, чтобы доставить все это в базу данных SQL, где нет предела, или для меньшей работы вы можете использовать коммерческие службы, такие как datadog , которые имеют красивые панели мониторинга :).
Вы хотите прочитать о таких вещах, как средства ( local1-7
), которые позволяют вам назначать группы в основном службам, не имеющим встроенного журнала syslog.
В определении выше, я отправляю свои журналы доступа и ошибок в logger
, который представляет собой служебную программу, предназначенную для приема журналов и записи их в общем формате в системный журнал вместе с подробностями службы, предоставляющей их.Вы можете видеть, что % v
- это первая часть моего журнала доступа, которая упрощает фильтрацию vhosts в системном журнале в будущем.
Вы заметите в директивах, что ошибка log использует local6.err
, в то время как журнал доступа использует local6.notice
, это фактически устанавливает уровень строки журнала, ошибки будут окрашены в красный цвет в lnav
], а остальные будут стандартными / info.
Остерегайтесь кроличьей дыры;)
Одним из решений было бы разделить объединенный журнал постфактум. У Apache есть утилита под названием split-logfile
( https://httpd.apache.org/docs/2.4/programs/split-logfile.html )
Создайте файл журнала с информацией о виртуальном хосте:
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined_plus_vhost
CustomLog logs/access_log combined_plus_vhost
Файлы журнала будут созданы в каталоге, где вы запускаете сценарий, для каждого имени виртуального хоста, которое появляется в объединенном файле журнала. Эти файлы журналов будут названы в честь имени хоста с расширением .log.
Объединенный файл журнала считывается из стандартного ввода. Прочитанные записи будут добавлены к любым существующим файлам журнала.
split-logfile < access_log