插件窝 干货文章 ThinkPHP如何优雅打印包含详细堆栈信息的错误日志?

ThinkPHP如何优雅打印包含详细堆栈信息的错误日志?

堆栈 日志 记录 Log 320    来源:    2025-03-15

在ThinkPHP中,优雅地打印包含详细堆栈信息的错误日志可以通过以下几种方式实现:

1. 使用 Log 类记录错误日志

ThinkPHP 提供了 Log 类来记录日志。你可以使用 Log::error() 方法来记录错误日志,并且可以通过 Exception 对象获取详细的堆栈信息。

try {
    // 你的业务逻辑代码
} catch (\Exception $e) {
    // 记录错误日志,包含堆栈信息
    \think\facade\Log::error($e->getMessage() . PHP_EOL . $e->getTraceAsString());
}

2. 使用 Exception 类的 getTrace() 方法

getTrace() 方法返回一个包含堆栈信息的数组,你可以将其转换为字符串并记录到日志中。

try {
    // 你的业务逻辑代码
} catch (\Exception $e) {
    // 获取堆栈信息数组
    $trace = $e->getTrace();
    // 将堆栈信息数组转换为字符串
    $traceString = print_r($trace, true);
    // 记录错误日志
    \think\facade\Log::error($e->getMessage() . PHP_EOL . $traceString);
}

3. 使用 Log 类的 write() 方法

Log::write() 方法允许你自定义日志级别和内容。你可以将堆栈信息作为日志内容的一部分写入。

try {
    // 你的业务逻辑代码
} catch (\Exception $e) {
    // 记录错误日志,包含堆栈信息
    \think\facade\Log::write($e->getMessage() . PHP_EOL . $e->getTraceAsString(), 'error');
}

4. 使用 Log 类的 record() 方法

Log::record() 方法允许你记录日志并指定日志级别。

try {
    // 你的业务逻辑代码
} catch (\Exception $e) {
    // 记录错误日志,包含堆栈信息
    \think\facade\Log::record($e->getMessage() . PHP_EOL . $e->getTraceAsString(), 'error');
}

5. 使用 Log 类的 error() 方法

Log::error() 方法专门用于记录错误日志。

try {
    // 你的业务逻辑代码
} catch (\Exception $e) {
    // 记录错误日志,包含堆栈信息
    \think\facade\Log::error($e->getMessage() . PHP_EOL . $e->getTraceAsString());
}

6. 使用 Log 类的 log() 方法

Log::log() 方法允许你自定义日志级别和内容。

try {
    // 你的业务逻辑代码
} catch (\Exception $e) {
    // 记录错误日志,包含堆栈信息
    \think\facade\Log::log('error', $e->getMessage() . PHP_EOL . $e->getTraceAsString());
}

7. 使用 Log 类的 write() 方法记录 JSON 格式的日志

如果你希望日志以 JSON 格式记录,可以将堆栈信息转换为 JSON 格式。

try {
    // 你的业务逻辑代码
} catch (\Exception $e) {
    // 将堆栈信息转换为 JSON 格式
    $logData = [
        'message' => $e->getMessage(),
        'trace' => $e->getTrace(),
    ];
    // 记录错误日志
    \think\facade\Log::write(json_encode($logData, JSON_PRETTY_PRINT), 'error');
}

8. 使用 Log 类的 record() 方法记录 JSON 格式的日志

try {
    // 你的业务逻辑代码
} catch (\Exception $e) {
    // 将堆栈信息转换为 JSON 格式
    $logData = [
        'message' => $e->getMessage(),
        'trace' => $e->getTrace(),
    ];
    // 记录错误日志
    \think\facade\Log::record(json_encode($logData, JSON_PRETTY_PRINT), 'error');
}

9. 使用 Log 类的 error() 方法记录 JSON 格式的日志

try {
    // 你的业务逻辑代码
} catch (\Exception $e) {
    // 将堆栈信息转换为 JSON 格式
    $logData = [
        'message' => $e->getMessage(),
        'trace' => $e->getTrace(),
    ];
    // 记录错误日志
    \think\facade\Log::error(json_encode($logData, JSON_PRETTY_PRINT));
}

10. 使用 Log 类的 log() 方法记录 JSON 格式的日志

try {
    // 你的业务逻辑代码
} catch (\Exception $e) {
    // 将堆栈信息转换为 JSON 格式
    $logData = [
        'message' => $e->getMessage(),
        'trace' => $e->getTrace(),
    ];
    // 记录错误日志
    \think\facade\Log::log('error', json_encode($logData, JSON_PRETTY_PRINT));
}

总结

在ThinkPHP中,你可以使用 Log 类的多种方法来记录包含详细堆栈信息的错误日志。根据你的需求,可以选择不同的方法来记录日志,并且可以将堆栈信息以字符串或 JSON 格式记录到日志中。这样可以方便地排查和定位问题。