Назад | Перейти на главную страницу

Динамические ошибки и настраиваемые журналы в apache 2 с использованием поддоменов с подстановочными знаками

Я пытаюсь создать файл конфигурации VirtualHost с подстановочными знаками для apache2, и я не уверен, как обрабатывать ErrorLog и CustomLog настройки, чтобы поместить журналы туда, куда я хочу. Как видите во втором VirtualHost, У меня есть журналы в logs папка в доменах DocumentRoot. Это отлично работает для статических VirtualHosts, но как бы это сделать для подстановочного знака 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