Расширение переменной в запросе файла журнала Apache2 на основе

Я хотел бы иметь настраиваемые файлы журналов для каждого пользователя, обращающегося к виртуальному хосту. Имя пользователя присутствует в переменной среды «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

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *