嘗試記錄到中央系統日誌伺服器,要么直接使用 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
在搜尋涉及從ErrorLog
Apache 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