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