如何格式化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,替代默认日志功能,实现结构化输出:
- 安装Monolog(通过Composer或手动引入)
- 编写日志初始化代码:
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
相关产品推荐
相关产品推荐

