Apache 錯誤日誌管道失敗

Apache 錯誤日誌管道失敗

嘗試記錄到中央系統日誌伺服器,要么直接使用 Apache 的 ErrorLog 透過管道傳輸到記錄器,要么讓系統日誌轉發,但沒有任何效果,並且錯誤對我來說沒有意義。我可以讓自訂日誌工作,但不能讓錯誤日誌工作。在 Ubuntu 14.04 上使用 Apache/2.4.7 和 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"

但隨後 tee 仍在抱怨:

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

到底為什麼要tee在第二個管道之後選擇選擇權,我能做些什麼來阻止這種情況呢?我被困住了,谷歌不是我的朋友,任何其他建議都值得讚賞。

答案1

第一個管道是 Apache 分叉新命令的程式碼,但它可能不會分叉一個全新的 shell,這將允許您使用新管道,而是執行命令,因此所有內容都被視為命令參數,包括新管道等。

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

另一種是隱式的,使用前綴關鍵字|$

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

根本原因是 Apache 2.4 中的更改,請參閱。http://httpd.apache.org/docs/2.4/upgrading.html

在 Unix 平台上,在 2.2 及更早版本中,使用 ErrorLog 或 CustomLog 配置的管道日誌記錄指令是使用 /bin/sh -c 呼叫的。在 2.4 及更高版本中,直接執行管道日誌記錄命令。若要復原舊的行為,請參閱管道日誌記錄文件。

答案2

在搜尋涉及從ErrorLogApache 2.2.31 中清理日誌事件的解決方案時發現了這篇文章,而 Apache 2.2.31 還沒有ErrorLogFormat.這是我想出的解決方案,並認為其他人會發現它很有用。

ErrorLog這會從使用 unbuffered中剝離引用sed

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

使用 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

相關內容