Я хотел бы иметь настраиваемые файлы журналов для каждого пользователя, обращающегося к виртуальному хосту.
Имя пользователя присутствует в переменной среды "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:
#!/бин/баш
при чтении STDIN
делать
# формат: [TIMESTAMP] IP ИМЯ ПОЛЬЗОВАТЕЛЯ TLS CYPHER PROTOCOL "ЗАПРОС" РАЗМЕР
TIMESTAMP=$(echo "$STDIN" | cut -d" " -f1-2)
IP=$(echo "$STDIN" | cut -d" " -f3)
USER=$(echo "$STDIN" | cut -d" " -f4)
TLS=$(эхо "$STDIN" | вырезать -d" " -f5)
CYPHER=$(echo "$STDIN" | cut -d" " -f6)
ПРОТОКОЛ=$(echo "$STDIN" | cut -d" " -f7)
ЗАПРОС=$(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
сделано
выход 0
Похоже, на данный момент это работает так, как ожидалось. Тем не менее, было бы здорово, если бы это можно было сделать без дорогостоящих вызовов внешних скриптов.