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

Ошибка конвейера журнала ошибок Apache

Попытка войти на центральный сервер системного журнала, либо напрямую с помощью Apache ErrorLog для конвейерной передачи в регистратор, либо заставить системный журнал пересылать, но ничего не работает, и ошибки не имеют для меня смысла. Я могу заставить работать 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 мне не друг, и любые другие советы приветствуются.

Первый канал - это код для 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 и новее команды протоколирования по конвейеру выполняются напрямую. Чтобы восстановить прежнее поведение, см. Документацию по конвейерному ведению журнала.

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

Это удаляет референт из ErrorLog используя небуферизованный sed:

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

Удаляет строку запроса из реферера, используя встроенный небуферизованный 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