我正在尝试为 apache2 创建一个通配符 VirtualHost conf 文件,但我不知道如何处理ErrorLog
和CustomLog
设置以将日志放在我想要的位置。正如您在第二个中看到的VirtualHost
,我将日志放在logs
域中的一个文件夹中DocumentRoot
。这对于静态 s 来说很好VirtualHost
,但是对于通配符我该怎么做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
?
我见过具有动态日志的虚拟主机中的通配符?,但这并不是我真正想要的,因为它最终还是将所有日志放入一个大文件中,而不是将它们拆分到各自子域特定的文件夹中。
答案1
冒着增加工作量的风险,您可能还想考虑反其道而行之,将所有日志文件合并到 中syslog
。这似乎更吓人,但却是一个更强大的解决方案。我不再费心处理单独的日志,而是将所有日志直接传送到 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 数据库中,在那里,天空是极限,或者为了减少工作量,你可以使用商业服务,例如数据狗有漂亮的仪表板:)。
你可能想阅读以下内容设施(local1-7
)它允许您将组分配给没有内置系统日志记录的服务。
在上述定义中,我将访问日志和错误日志都传输到实用程序,logger
该实用程序旨在接受日志并以通用格式将它们连同提供它们的服务的详细信息一起记录在 syslog 中。您可以看到这%v
是我的访问日志的第一部分,这使得以后在 syslog 中筛选 vhost 变得容易。
您会在指令中注意到,错误日志使用local6.err
而访问日志使用local6.notice
,这实际上设置了日志行的级别,错误最终会以红色显示lnav
,而其他错误将是标准/信息。
小心兔子洞 ;)
答案2
一种解决方案是事后拆分合并的日志。Apache 有一个名为split-logfile
(https://httpd.apache.org/docs/2.4/programs/split-logfile.html)
来自文档……
创建一个包含虚拟主机信息的日志文件:
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined_plus_vhost
CustomLog logs/access_log combined_plus_vhost
将在运行脚本的目录中为组合日志文件中出现的每个虚拟主机名创建日志文件。这些日志文件将以主机名命名,文件扩展名为 .log。
组合日志文件从标准输入读取。读取的记录将附加到任何现有日志文件中。
split-logfile < access_log