15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
22.10.2024

如何为WordPress创建和访问错误日志(3种方法)

WordPress错误日志是诊断记录,用于捕获服务器上发生的PHP错误、致命异常、数据库故障、插件冲突和主题不兼容问题。访问和解读这些日志是识别页面损坏、白屏死机或静默性能回归根本原因的最快方式——无需猜测或逐一禁用插件。

本指南涵盖三种经过生产环境验证的方法,用于启用、定位和读取WordPress错误日志:原生WP_DEBUG堆栈、通过托管控制面板访问服务器级日志,以及基于插件的日志查看器。每种方法适用于不同的访问级别和使用场景,三种方法均附有精确的文件路径、配置语法和安全注意事项。

为什么WordPress错误日志很重要

WordPress运行在PHP之上,PHP会生成几类运行时消息:致命错误(执行停止)、警告(执行继续但存在问题)、通知(信息性提示,通常表示已弃用的代码)以及弃用消息(计划移除的函数)。默认情况下,在大多数生产环境配置中,这些消息都不会写入持久日志——它们要么被抑制,要么输出到浏览器,这存在安全风险。

没有日志,插件更新引入致命错误时只会产生一个空白页面。配置错误的SMTP库会静默丢弃邮件。内存限制超出会导致页面加载失败且没有任何可见痕迹。错误日志将这些不可见的故障转化为带时间戳、文件引用和行号的条目,让您可以立即采取行动。

方法一:通过wp-config.php启用WordPress调试模式

WordPress内置了一个调试子系统,由wp-config.php中定义的一组PHP常量控制。这是最精确的方法,因为它能捕获WordPress特定的错误,包括插件API、主题加载器和数据库抽象层(wpdb)抛出的错误。

第一步:定位并打开wp-config.php

使用FileZilla或Cyberduck等客户端通过SFTP(出于安全考虑,优先于普通FTP)连接到您的服务器,或打开托管提供商的文件管理器。导航到WordPress根目录,通常为/public_html//var/www/html/wp-config.php文件位于该目录的根目录下。

如果您有SSH访问权限,可以直接编辑:

nano /var/www/html/wp-config.php

第二步:配置调试常量

找到现有的行:

define( 'WP_DEBUG', false );

将整个代码块替换为以下配置,该配置在不向网站访客暴露错误的情况下启用日志记录:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );

每个常量的作用:

  • WP_DEBUG — 激活WordPress调试引擎,并在E_ALL级别启用PHP错误报告。
  • WP_DEBUG_LOG — 将所有捕获的错误写入日志文件,而非(或同时)输出到屏幕。
  • WP_DEBUG_DISPLAY — 设置为false时,抑制屏幕上的输出。这在生产站点上至关重要;若不设置,PHP通知会将内部文件路径和变量名泄露给访客。
  • display_errors — 底层PHP指令;通过ini_set将其设置为0,在插件或主题覆盖WP_DEBUG_DISPLAY时提供第二层抑制。

第三步:定位调试日志文件

WP_DEBUG_LOG设置为true后,WordPress将错误写入:

/wp-content/debug.log

该文件在第一次记录错误时自动创建。您可以通过SFTP或SSH查看:

tail -f /var/www/html/wp-content/debug.log

tail -f标志可实时流式传输新条目,在交互式重现特定错误时非常有价值。

第四步:使用自定义日志路径(出于安全考虑,推荐使用)

如果您的Web服务器没有明确阻止,默认的debug.log路径是可公开访问的。配置错误的服务器会将https://yourdomain.com/wp-content/debug.log提供给任何访客,从而暴露内部路径、数据库表前缀和类名。

选项A — 将日志文件移至Web根目录之外:

define( 'WP_DEBUG_LOG', '/var/log/wordpress/debug.log' );

创建目标目录并设置权限:

mkdir -p /var/log/wordpress
chown www-data:www-data /var/log/wordpress
chmod 750 /var/log/wordpress

选项B — 通过.htaccess(Apache)阻止默认路径:

<Files "debug.log">
    Order allow,deny
    Deny from all
</Files>

选项C — 在服务器块中使用Nginx等效配置:

location ~* /wp-content/debug.log {
    deny all;
    return 404;
}

第五步:排查完成后禁用调试模式

切勿在生产站点上将WP_DEBUG设置为true超过必要时间。问题解决后:

define( 'WP_DEBUG', false );
define( 'WP_DEBUG_LOG', false );
define( 'WP_DEBUG_DISPLAY', false );

在生产站点上保持调试模式会降低性能(PHP处理每个E_ALL通知),并且如果WP_DEBUG_DISPLAY意外设置为true,可能会暴露敏感的堆栈跟踪信息。

方法二:通过托管控制面板访问服务器级错误日志

在WordPress引导完成之前发生的错误——例如wp-config.php损坏、PHP版本不兼容或数据库连接失败——永远不会出现在debug.log中,因为WordPress本身从未加载。对于这些情况,您需要服务器的PHP错误日志或Apache/Nginx错误日志。

基于cPanel的托管

如果您的托管环境使用带cPanel的VPS,可通过控制面板界面访问错误日志:

  1. 登录cPanel。
  2. 导航至指标 > 错误
  3. 面板显示您账户Apache错误日志的最后300行。

要获取完整日志文件,请使用cPanel的文件管理器或通过SFTP连接并导航至:

/home/yourusername/logs/yourdomain.com-ssl_log
/home/yourusername/logs/yourdomain.com-error_log

确切的文件名因服务器配置而异,但在大多数cPanel安装中模式是一致的。

基于Plesk的托管

在Plesk中,导航至网站和域名 > 选择您的域名 > 日志。您可以按日志类型(访问、错误、PHP)筛选并下载完整日志文件。

直接服务器访问(VPS或独立服务器)

在拥有root访问权限的VPS托管独立服务器环境中,日志位置取决于您的技术栈:

技术栈默认错误日志路径
Apache (Ubuntu/Debian)/var/log/apache2/error.log
Apache (CentOS/RHEL)/var/log/httpd/error_log
Nginx/var/log/nginx/error.log
PHP-FPM/var/log/php-fpm/www-error.log/var/log/php8.x-fpm.log
MySQL / MariaDB/var/log/mysql/error.log

实时监控PHP-FPM日志:

tail -f /var/log/php8.2-fpm.log

在Apache日志中搜索WordPress特定的致命错误:

grep -i "fatal|wordpress|wp-" /var/log/apache2/error.log | tail -50

在服务器级别配置PHP错误日志

如果PHP错误未被写入日志,请检查您的php.ini配置:

php --ini | grep "Loaded Configuration"

打开已识别的php.ini文件并验证或设置:

log_errors = On
error_log = /var/log/php_errors.log
display_errors = Off
error_reporting = E_ALL

更改后重启PHP-FPM:

systemctl restart php8.2-fpm

或者,使用.htaccess文件(仅限Apache)按站点覆盖PHP设置:

php_flag log_errors on
php_value error_log /var/log/wordpress/php_errors.log
php_flag display_errors off

方法三:使用WordPress错误日志插件

对于直接服务器访问受限的环境——例如共享虚拟主机——或者非技术管理员需要在没有SSH访问权限的情况下查看错误的团队,WordPress插件提供了一种可行的替代方案。

推荐插件

  • WP Log Viewer — 读取现有的debug.log文件,并在WordPress管理后台中以带过滤和搜索功能的方式显示。
  • Error Log Monitor — 添加一个显示最近错误的仪表板小部件,并可在记录新错误时发送电子邮件提醒。
  • Query Monitor — 超越错误日志,可分析数据库查询、HTTP API调用、钩子和条件标签。对于性能调试至关重要。
  • Health Check & Troubleshooting — WordPress.org官方插件;启用故障排查模式,仅为您的会话激活默认主题并禁用所有插件,不影响其他访客。

安装和配置Error Log Monitor

  1. 在WordPress管理后台,前往插件 > 添加新插件
  2. 搜索Error Log Monitor,点击立即安装,然后点击启用
  3. 导航至设置 > Error Log Monitor
  4. 设置日志文件路径。如果您已将debug.log移至Web根目录之外,请在此处输入绝对服务器路径。
  5. 如果您希望收到新错误类型的通知,请配置电子邮件提醒频率。

该插件读取与WP_DEBUG_LOG写入的相同debug.log文件。它不创建单独的日志记录机制——它只是一个查看器。这意味着WP_DEBUGWP_DEBUG_LOG仍必须在wp-config.php中启用,插件才能显示任何内容。

关键限制:插件在WordPress引导后才加载。任何阻止WordPress加载的错误(数据库连接失败、核心文件损坏、PHP版本不兼容)都不会在任何基于插件的日志查看器中显示。对于这些情况,方法二是唯一选择。

对比:三种WordPress错误日志记录方法

标准WP_DEBUG (wp-config.php)服务器/托管日志日志插件
设置复杂度低(编辑一个文件)中(需要控制面板或SSH)极低(安装插件)
捕获引导前错误
WordPress特定错误部分是(通过debug.log)
实时流式传输通过SSH使用tail -f通过tail -f或控制面板仪表板刷新
适合生产环境仅在DISPLAY=false时
需要服务器访问SFTP/SSH或文件管理器SSH或控制面板
配置错误时的安全风险高(日志URL暴露)
数据库查询日志是(Query Monitor)
最适合活跃开发/调试服务器级故障非技术团队

读取和解读WordPress错误日志条目

原始的debug.log条目如下所示:

[04-Jul-2025 14:32:11 UTC] PHP Fatal error: Uncaught Error: Call to undefined function get_field() in /var/www/html/wp-content/themes/mytheme/functions.php:47
Stack trace:
#0 /var/www/html/wp-content/themes/mytheme/functions.php(47): get_field()
#1 {main}
thrown in /var/www/html/wp-content/themes/mytheme/functions.php on line 47

如何读取:

  • 时间戳为UTC——如有需要,请转换为服务器的本地时区。
  • PHP Fatal error表示执行已停止。触发此错误的页面返回了500错误或空白页面。
  • Call to undefined function get_field()表示Advanced Custom Fields插件已停用,或在主题的functions.php尝试调用它之后才加载。
  • 堆栈跟踪显示确切的文件和行号。从functions.php的第47行开始调试。

常见错误模式及其原因:

  • PHP Warning: require(): Failed opening required — 文件路径错误或文件缺失。通常由插件引用已删除的文件引起。
  • PHP Deprecated: Function _register_controls is deprecated — 插件或主题使用了过时的API。不是致命错误,但表明该插件尚未针对当前WordPress/Elementor版本进行更新。
  • WordPress database error ... for querywpdb查询失败。检查表前缀不匹配或表损坏问题。
  • Maximum execution time of 30 seconds exceeded — 脚本运行时间过长。常见于大型导入、未优化的查询或超时的外部API调用。
  • Allowed memory size of X bytes exhausted — PHP达到内存限制。在php.ini中增加memory_limit,或找出内存泄漏的插件。

管理WordPress错误日志的最佳实践

轮转日志以防止磁盘耗尽。遭受攻击或存在重复错误的繁忙WordPress站点每天可能生成数百兆字节的日志数据。在Linux服务器上,配置logrotate

nano /etc/logrotate.d/wordpress-debug
/var/log/wordpress/debug.log {
    daily
    rotate 14
    compress
    missingok
    notifempty
    create 640 www-data www-data
}

切勿将debug.log提交到版本控制。将其添加到.gitignore

wp-content/debug.log

每次服务器迁移后审查您的wp-config.php托管迁移经常将WP_DEBUG重置为false,或引入新的wp-config.php模板覆盖您的常量。

使用SAVEQUERIES进行数据库级调试。将此常量与WP_DEBUG一起添加,以记录WordPress执行的每个SQL查询:

define( 'SAVEQUERIES', true );

然后在自定义模板中或通过Query Monitor检查$wpdb->queries。使用后立即禁用——它将每个查询存储在内存中,会显著增加RAM消耗。

将日志时间戳与部署事件关联。如果出现新的错误类型,检查其是否与插件更新、WordPress核心更新或服务器上的PHP版本变更同时发生。大多数托管控制面板会在单独的审计跟踪中记录PHP版本变更。

决策矩阵:选择使用哪种方法

场景推荐方法
插件冲突导致500错误方法一(WP_DEBUG)
全新安装时出现白屏死机方法二(服务器日志)
数据库连接被拒绝方法二(服务器日志)
非开发人员需要查看错误方法三(插件)
共享托管,无SSH访问方法三 + 通过控制面板使用方法二
VPS或独立服务器,完整root访问方法一 + 方法二组合
更新后反复出现静默邮件发送失败方法一 + SMTP插件日志
更新后性能回归方法一 + Query Monitor插件

技术要点检查清单

  • 在任何有实时流量的站点上启用WP_DEBUG_LOG之前,将WP_DEBUG_DISPLAY设置为false
  • debug.log移至Web根目录之外或通过服务器规则阻止——默认路径是可公开访问的。
  • 交互式重现错误时,对日志文件使用tail -f;这样无需手动刷新文件。
  • 服务器级PHP和Apache/Nginx日志是WordPress加载前发生的错误的唯一真实来源。
  • 基于插件的日志查看器需要WP_DEBUG_LOG处于活动状态——它们是读取器,而非写入器。
  • 在任何启用WP_DEBUG_LOG超过几小时的服务器上实施日志轮转。
  • 切勿在生产环境中保持SAVEQUERIES启用;它会造成内存和性能负担。
  • 解决问题后,将所有调试常量设回false,并通过浏览器请求验证页面源代码中没有PHP通知出现。

常见问题解答

WordPress调试日志文件默认位于哪里?

WordPress将调试日志写入相对于WordPress根目录的/wp-content/debug.log。只有在记录第一个错误后才会创建此路径,且仅当WP_DEBUGWP_DEBUG_LOGwp-config.php中均设置为true时才会创建。您可以通过将绝对文件路径字符串作为WP_DEBUG_LOG的值(而非true)来覆盖该路径。

在生产站点上启用WP_DEBUG是否安全?

只有在WP_DEBUG_DISPLAY明确设置为falsedisplay_errors设置为0时才是安全的。没有这两个设置,PHP错误——包括内部文件路径和数据库表名——会直接渲染在每个页面的HTML源代码中。在任何有公共流量的站点上,始终将WP_DEBUG trueWP_DEBUG_DISPLAY false配合使用。

为什么即使启用了WP_DEBUG,我的debug.log文件仍然是空的?

最常见的原因是:Web服务器进程没有对/wp-content/目录的写入权限;WP_DEBUG_LOGwp-config.php中设置为false或缺失;或者错误发生在服务器级别,WordPress加载之前,这意味着它会出现在Apache或PHP-FPM日志中,而非debug.log中。使用ls -la wp-content/检查目录权限,并验证常量在wp-config.php中以正确顺序定义。

WP_DEBUG_LOG与服务器PHP错误日志有什么区别?

WP_DEBUG_LOG是一个WordPress级别的常量,将WordPress自定义错误处理程序捕获的错误路由到debug.log。服务器的PHP错误日志(通过php.ini中的error_log配置)在解释器级别捕获所有PHP错误,包括WordPress初始化之前发生的错误。在正确配置的服务器上,两个日志同时处于活动状态并相互补充。

我可以在没有SSH访问权限的共享托管上启用错误日志记录吗?

可以。您可以通过cPanel或Plesk中托管提供商的文件管理器编辑wp-config.php,启用WP_DEBUGWP_DEBUG_LOG,然后通过同一文件管理器界面读取debug.log。对于共享虚拟主机上的服务器级日志,请使用cPanel中指标下的错误部分。如果您需要对PHP配置和日志路径进行更精细的控制,升级到VPS托管计划可让您直接访问php.ini并获得对所有日志文件的完整SSH访问权限。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用