Я хотел бы иметь настраиваемые файлы журналов для каждого пользователя, обращающегося к виртуальному хосту. Имя пользователя присутствует в переменной среды «SSL_CLIENT_S_DN_CN» (исходя из проверки подлинности сертификата клиента). Итак, сначала я попробовал что-то вроде
CustomLog /var/log/apache2/by_user/%{SSL_CLIENT_S_DN_CN}x.log \
"%t %h %{SSL_CLIENT_S_DN_CN}x %{SSL_PROTOCOL}x %{SSL_CIPHER}x %H \"%r\" %b"
что, очевидно, не работает, поскольку модуль журнала сам по себе не расширяет переменную в пути к файлу.
Моя проблема похожа на эту здесь, но мне нужна замена на основе запроса, а не только один раз, когда Apache загружает конфигурацию сайта.
mod_macro, кажется, делает расширение только один раз, когда загружается конфигурация, поэтому этот подход не решает мою проблему.
Я также пытался создать журнал во внешнем скрипте (logtest), используя функцию «log pipe», но это приводит к «ошибке в условии условия»:
CustomLog "|/usr/local/bin/logtest" "/var/log/apache2/by_user/%{SSL_CLIENT_S_DN_CN}x.log" \
"%t %h %{SSL_CLIENT_S_DN_CN}x %{SSL_PROTOCOL}x %{SSL_CIPHER}x %H \"%r\" %b"
Можно ли получить что-то вроде макросов, выполняемых для каждого отдельного запроса, чтобы я мог создавать отдельные файлы журнала для каждого пользователя?
РЕДАКТИРОВАТЬ:
Теперь у меня есть временное решение, использующее «конвейерные журналы», например:
Конфигурация сайта апача:
CustomLog "|/usr/local/bin/apache_logger" "%t %h %{SSL_CLIENT_S_DN_CN}x %{SSL_PROTOCOL}x %{SSL_CIPHER}x %H \"%r\" %b"
bash-скрипт, расположенный в /usr/local/bin/apache_logger:
#!/bin/bash
while read STDIN
do
# format: [TIMESTAMP] IP USERNAME TLS CYPHER PROTOCOL "REQUEST" SIZE
TIMESTAMP=$(echo "$STDIN" | cut -d" " -f1-2)
IP=$(echo "$STDIN" | cut -d" " -f3)
USER=$(echo "$STDIN" | cut -d" " -f4)
TLS=$(echo "$STDIN" | cut -d" " -f5)
CYPHER=$(echo "$STDIN" | cut -d" " -f6)
PROTOCOL=$(echo "$STDIN" | cut -d" " -f7)
REQUEST=$(echo "$STDIN" | cut -d" " -f8-10)
SIZE=$(echo "$STDIN" | cut -d" " -f11)
echo "$TIMESTAMP $IP $USER $TLS $CYPHER $PROTOCOL $REQUEST $SIZE" >> /var/log/apache2/by_user/$USER.log
done
exit 0
Похоже, на данный момент это работает так, как ожидалось. Тем не менее, было бы здорово, если бы это можно было сделать без дорогостоящих вызовов внешних скриптов.
ведение журнала apache2
КрисТГ74