Я пытаюсь создать файл конфигурации 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
пример выше?
Я видел Подстановочные знаки в виртуальных хостах с динамическими журналами? , но это не совсем то, что мне нужно, так как все журналы по-прежнему помещаются в один большой файл, а не разбиваются на отдельные папки для поддоменов.
Рискуя дать вам больше работы, вы также можете подумать о том, чтобы пойти в противоположном направлении и объединить ВСЕ свои файлы журнала в syslog
. Это кажется более устрашающим, но это гораздо более эффективное решение. Я больше не заморачиваюсь с отдельными журналами и просто передаю все журналы напрямую в системный журнал (который хранит все в / 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, где нет предела, или для меньшей работы вы можете использовать коммерческие службы, такие как собака с красивыми дашбордами :).
Вы захотите прочитать о таких вещах, как объекты (local1-7
), которые позволяют назначать группы в основном службам, не имеющим встроенного журнала syslog.
В приведенном выше определении я передаю журналы доступа и журналы ошибок в logger
который представляет собой служебную программу, предназначенную для приема журналов и записи их в общем формате в системный журнал вместе с подробными сведениями о предоставляющей их службе. Вы можете видеть, что %v
это первая часть моего журнала доступа, которая позволяет легко фильтровать vhosts в системном журнале в будущем.
В директивах вы заметите, что журнал ошибок использует 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