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