Apache 오류 로그 파이핑 실패

Apache 오류 로그 파이핑 실패

Apache의 ErrorLog를 사용하여 로거로 파이프하거나 syslog를 전달하도록 지시하여 중앙 syslog 서버에 로그인하려고 시도하지만 아무것도 작동하지 않으며 오류가 이해되지 않습니다. 사용자 정의 로그는 작동하지만 ErrorLog는 작동하지 않습니다. rsyslogd 7.4.4와 함께 Ubuntu 14.04에서 Apache/2.4.7을 사용합니다.

내 가상 호스트의 구성(로거 옵션 뒤에 공백이 있거나 없는 것은 차이가 없습니다):

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"

하지만 Tee는 여전히 불평하고 있습니다.

/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를 사용하여 구성된 파이프 로깅 명령이 2.2 이하에서 /bin/sh -c를 사용하여 호출되었습니다. 2.4 이상에서는 파이프 로깅 명령이 직접 실행됩니다. 이전 동작을 복원하려면 파이프된 로깅 문서를 참조하세요.

답변2

ErrorLog아직 . ErrorLogFormat​제가 생각해낸 해결책은 다음과 같습니다. 다른 사람들도 이 방법이 유용할 것이라고 생각했습니다.

이는 ErrorLogunbuffered를 사용하여 리퍼러를 제거합니다 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

관련 정보