我们收到“PHP 允许的内存已耗尽”的消息,其中 PHP 要求使用 GB 的内存。我该如何格式化 Apache 错误日志以查看它正在访问哪个 URL?
答案1
取自 debian apache2.conf 默认文件:
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
# If you are behind a reverse proxy, you might want to change %h into %{X-Forwarded-For}i
#
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
看Apache 2 手册不同格式符号 % 或Apache 2 手册 ErrorlogFormat 指令从 apache 2.4 开始,错误日志也采用特定格式。
简而言之 :
在主配置文件中定义输出格式,并在 VirtualHost 指令中定义每个 vhost 的输出文件(例如)。如果您愿意,也可以在主文件中定义所有站点的配置文件。
需要添加类似的内容(如果尚未添加):
LogLevel warn
CustomLog /var/log/apache2/access.log combined
ErrorLog /var/log/apache2/error.log
根据您的具体设置,您可能需要稍微更改位置。
如果您的网站流量很大,请不要忘记对它们进行日志轮换。
通常这应该是(至少在 debian 中)我记得的默认设置。
如果您有空日志,您可能需要检查文件夹/文件的权限,以便 apache2 进程运行的用户可以访问和写入它们。
请记住,重新加载该过程(就我所知)需要重新读取配置文件。
答案2
接受的答案并未回答原始问题,因为它记录到access.log而不是error.log
您需要将 url 放在环境变量中,然后从 ErrorLogFormat 调用它,如下所示:
SetEnvIf Request_URI "(^.*$)" RURI=$1
ErrorLogFormat "%{cu}t %a %l %M URI:%{RURI}e"
答案3
这对我有用:
ErrorLogFormat "[%t] %{Request_URI}e (Referer: %{Referer}i) [client %a] [%l] %M"
当我为请求 URI 创建一个单独的变量时,如 @kofifus 和 @franfran 所示,我得到了 URL 重写后运行的底层脚本,但我想要用户在 Web 浏览器中看到的路径,这就是它给我的。
答案4
我遇到了同样的问题。当您查看错误日志并想知道哪个 URL 触发了它时。
ErrorLogFormat 仅在 Apache 2.4 中可用
自定义日志和错误日志的日志标记不同,您不能简单地使用自定义日志标记并将其放入 ErrorLogFormat 中
ErrorLogFormat 标记: https://httpd.apache.org/docs/2.4/mod/core.html#errorlogformat
CustomLog 令牌: https://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats
也许可以使用变量并将其放入 ErrorLogFormat,但就我自己的测试而言,我无法使其工作。
例如 SetEnvIf Request_URI "(^.*$)" RURI=$1 设置环境变量 QUERY_STRING "(^.*$)" QSTRING=$1 错误日志格式“%t [URI:%{RURI}e] [QSTRING:%{QSTRING}e] %M”
- 最后,事实证明“正确”的方法是使用令牌 LogID 并从 CustomLog 中引用它
例如 LogFormat“[LogID: %L] %t \” %r \” %h” 自定义 id 错误日志格式“[日志ID: %L] %t %M”
希望能帮助到你