Ошибка конвейеризации Apache errorlog

Ошибка конвейеризации Apache errorlog

Пытаюсь зарегистрировать на центральном сервере syslog, либо напрямую, используя Apache ErrorLog для передачи в регистратор, либо заставляя syslog пересылать, но ничего не работает, и ошибки для меня непонятны. Я могу заставить работать Custom log, но не ErrorLog. Использую Apache/2.4.7 на Ubuntu 14.04 с rsyslogd 7.4.4.

Конфигурация моего виртуального хоста (с пробелом после параметров логгера или без него — не имеет значения):

LogLevel warn
ErrorLog  "|/usr/bin/tee -a /var/log/apache2/error.log | /usr/bin/logger -tapache_err -plocal1.error"
CustomLog "|/usr/bin/logger -p local4.warning -t apache" combined

и затем получаю эту ошибку:

/usr/bin/tee: invalid option -- 't'

Также пробовал (с двойными кавычками и без них):

ErrorLog "|syslog:local1"

Но потом получил:

(2)No such file or directory: AH00089: Couldn't start ErrorLog process 'syslog:local1'.
AH00015: Unable to open logs

Даже пробовал:

ErrorLog "| /usr/bin/tee -a /var/log/apache2/error.log | nc -u -j xxx.xxx.xxx.xxx 514"

Но Ти все еще жалуется:

/usr/bin/tee: invalid option -- 'u'

Почему, черт возьми, teeвыбор опций происходит после второй трубы и что я могу сделать, чтобы остановить это? Я застрял, Google мне не друг, и любые другие советы приветствуются.

решение1

Первый канал — это код для Apache, который создает новую команду, но, скорее всего, это не создание совершенно новой оболочки, что позволило бы вам использовать новый канал, а выполнение команды, поэтому все рассматривается как аргумент команды, включая новый канал и т. д. Вероятно, вы можете обойти это, заключив его в оболочку, используя два метода, один из которых — явный:

ErrorLog "|/bin/sh -c 'tee ... | logger ...'"

А другой — неявно, с использованием ключевого слова prefix |$:

ErrorLog "|$tee ... | logger ..."

Основная причина — изменение в Apache 2.4, см.http://httpd.apache.org/docs/2.4/upgrading.html:

На платформах Unix команды конвейерного ведения журнала, настроенные с помощью ErrorLog или CustomLog, вызывались с помощью /bin/sh -c в 2.2 и более ранних версиях. В 2.4 и более поздних версиях команды конвейерного ведения журнала выполняются напрямую. Чтобы восстановить старое поведение, см. документацию по конвейерному ведению журнала.

решение2

Нашел этот пост, когда искал решение, связанное с очисткой событий журнала в ErrorLogApache 2.2.31, в котором еще нет ErrorLogFormat. Вот решение, которое я придумал, и подумал, что другим оно будет полезно.

Это исключает возможность ErrorLogиспользования небуферизованного реферера sed:

ErrorLog "|/bin/sed -u \'s/,\ referer: .*//\' >> /var/log/httpd/error_log"

Удаляет строку запроса из referer, используя inline unbuffered perl:

ErrorLog "|/usr/local/bin/perl -ne \'$|=1;while (<>){$output = $_; $output =~ s/(referer:\ .*)\?/$1/; print $output}\'>>/var/log/httpd/error_log

Вызов скрипта Perl:

ErrorLog "|/usr/local/bin/perl /tmp/fuss.pl >> /var/log/httpd/error_log

Связанный контент