You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何格式化PHP错误日志?解决Timber框架日志可读性问题

可行的错误日志格式化方案

1. 利用WordPress钩子拦截并格式化日志(无需修改Timber核心)

WordPress提供wp_log_data钩子,可在日志写入前拦截内容,针对Timber输出的print_r格式上下文进行转换:

add_filter('wp_log_data', function($log_data) {
    // 匹配Timber输出的上下文特征
    if (strpos($log_data['message'], 'Timber::context') !== false && strpos($log_data['message'], 'Array') !== false) {
        // 提取print_r的数组内容(需根据实际日志格式调整匹配逻辑)
        preg_match('/Array\s*\((.*)\)/s', $log_data['message'], $matches);
        if (!empty($matches[1])) {
            // 将print_r字符串转回数组,再用var_export生成格式化文本
            ob_start();
            eval('$context = Array(' . $matches[1] . ');');
            $formatted = var_export($context, true);
            ob_end_clean();
            // 替换原日志内容
            $log_data['message'] = str_replace($matches[0], $formatted, $log_data['message']);
        }
    }
    return $log_data;
});

注意:eval存在一定安全风险,仅在可信环境中使用;若上下文包含特殊字符,需调整正则匹配逻辑。

2. 命令行实时格式化日志

如果不想修改代码,可通过命令行工具对日志文件进行实时监控和格式化:

  • 用tail监控日志,配合PHP脚本解析print_r内容:
tail -f /path/to/wordpress/error.log | php -r '$stdin = fopen("php://stdin", "r"); while ($line = fgets($stdin)) { if (str_contains($line, "Timber::context") && str_contains($line, "Array")) { preg_match("/Array\s*\((.*)\)/s", $line, $matches); if (!empty($matches[1])) { eval("$context = Array(" . $matches[1] . ");"); echo str_replace($matches[0], var_export($context, true), $line); } else { echo $line; } } else { echo $line; } }'

3. 用Timber过滤器修改上下文输出格式

Timber提供过滤器允许修改错误日志中的上下文内容,无需修改核心文件:

add_filter('timber/error/context', function($context) {
    // 替换print_r为带缩进的var_export格式
    return var_export($context, true);
    // 或用JSON格式:return json_encode($context, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
});

需确认Timber版本支持该过滤器,若版本较旧,可查找对应错误处理类的钩子(如timber/error/message)。

4. 替换WordPress默认日志系统为结构化日志工具

集成Monolog库到WordPress,替代默认日志功能,实现结构化输出:

  1. 安装Monolog(通过Composer或手动引入)
  2. 编写日志初始化代码:
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Formatter\LineFormatter;

add_action('init', function() {
    // 创建日志实例
    $logger = new Logger('timber-site');
    // 配置格式化器,输出带缩进的结构化内容
    $formatter = new LineFormatter(
        "[%datetime%] %channel%.%level_name%: %message%\n",
        null,
        true, // 启用缩进
        true
    );
    $handler = new StreamHandler('/path/to/wordpress/error.log', Logger::DEBUG);
    $handler->setFormatter($formatter);
    $logger->pushHandler($handler);

    // 替换Timber的日志处理器
    add_filter('timber/logger', function() use ($logger) {
        return $logger;
    });
});

这样Timber的错误日志会以结构化、缩进分明的格式输出。

内容的提问来源于stack exchange,提问作者Zeth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:10:27