apache 2 中使用萬用字元子域的動態錯誤和自定義日誌
我正在嘗試為 apache2 製作萬用字元 VirtualHost conf 文件,但我不確定如何處理
ErrorLog
和CustomLog
設置以將日誌放在我希望它們去的地方。正如您在第二個中看到的那樣VirtualHost
,我將日誌放在logs
域中的一個文件夾中DocumentRoot
。這適用於 staticVirtualHost
,但我將如何處理萬用字元VirtualHost
。例如,第一個VirtualHost
.NameVirtualHost *:80 # Wild card all subdomains <VirtualHost *:80> ServerAlias *.example.com VirtualDocumentRoot /var/www/%0/public ErrorLog ????? CustomLog ????? combined </VirtualHost> # Main domain <VirtualHost *:80> ServerName example.com ServerAlias www.example.com DocumentRoot /var/www/example.com/public ErrorLog /var/www/example.com/logs/error.log CustomLog /var/www/example.com/logs/access.log combined </VirtualHost>
我已經嘗試過
ErrorLog /var/www/*.example.com/logs/error.log
,ErrorLog /var/www/%0/logs/error.log
並且相同CustomLog
,但是當我嘗試重新啟動 apache 時,它會引發錯誤。我應該使用什麼語法來獲得
ErrorLog
上面範例的工作版本?我在帶有動態日誌的虛擬主機中看到了萬用字元?,但這並不是我真正想要的,因為它仍然最終將所有日誌放入一個大文件中,而不是將它們拆分到自己的子域特定文件夾中。
冒著給您更多工作的風險,您可能還想考慮採取相反的方向並將所有日誌文件合併到
syslog
. 這似乎更令人生畏,但它是一個更有能力的解決方案。我根本不再關心單獨的日誌,只需將所有日誌直接通過管道傳輸到系統日誌(它將所有內容保存在 /var/log/messages 中)。儘管 Apache 本身並沒有這樣做,但您可以像這樣實現它……
LogLevel info ErrorLog "| /usr/bin/logger -thttpd -plocal6.err" CustomLog "| /usr/bin/logger -thttpd -plocal6.notice" "%v %h %l %u %t \"%r\" %>s %b"
Syslog 將為您提供很多選項,因為設置了大量的服務和實用程序來解析和管理它。我
lnav
個人喜歡使用,您可以過濾、排序、搜尋等,並且 ssh 上的界面是彩色的,因此很容易發現問題。您還可以使用實用程序將所有這些傳遞到一個沒有限制的 SQL 數據庫中,或者為了減少工作量,您可以使用具有漂亮儀表板的商業服務,如datadog :)。您需要閱讀設施(
local1-7
在上面的定義中,我將我的訪問日誌和錯誤日誌都傳送到
logger
該實用程序中,該實用程序旨在接受日誌並在 syslog 中以通用格式記錄它們以及提供它們的服務的詳細資訊。您可以看到這%v
是我的訪問日誌的第一部分,它可以輕鬆過濾 syslog 中的虛擬主機。您會在指令中註意到,錯誤日誌使用
local6.err
而訪問日誌使用local6.notice
,這實際上設置了日誌行的級別,錯誤最終將在 中塗成紅色lnav
,而其他錯誤將是標準/資訊。當心兔子洞;)