插件窝 干货文章 ThinkPHP中如何优雅打印详细异常日志像Laravel一样?

ThinkPHP中如何优雅打印详细异常日志像Laravel一样?

日志 Monolog 异常 记录 204    来源:    2025-03-15

在ThinkPHP中,虽然默认的异常处理机制不如Laravel那样详细,但你可以通过一些配置和自定义代码来实现类似Laravel的详细异常日志打印。以下是一些步骤和建议,帮助你在ThinkPHP中优雅地打印详细的异常日志。

1. 配置日志驱动

首先,确保你的ThinkPHP项目已经配置了日志驱动。在config/log.php中,你可以配置日志的驱动、存储路径等。

return [
    'default' => 'file', // 默认日志驱动
    'channels' => [
        'file' => [
            'type' => 'file',
            'path' => '../runtime/log/', // 日志存储路径
            'level' => ['error', 'info', 'debug'], // 日志级别
            'single' => false, // 是否单一文件
            'max_files' => 30, // 最大日志文件数
        ],
    ],
];

2. 自定义异常处理

ThinkPHP允许你自定义异常处理。你可以在app/ExceptionHandle.php中重写render方法,以便在捕获异常时记录详细的日志。

namespace app;

use think\exception\Handle;
use think\exception\HttpException;
use think\exception\ValidateException;
use think\facade\Log;
use Throwable;

class ExceptionHandle extends Handle
{
    public function render($request, Throwable $e)
    {
        // 记录详细的异常信息
        $this->logException($e);

        // 其他自定义处理逻辑
        return parent::render($request, $e);
    }

    protected function logException(Throwable $e)
    {
        $log = [
            'message' => $e->getMessage(),
            'code' => $e->getCode(),
            'file' => $e->getFile(),
            'line' => $e->getLine(),
            'trace' => $e->getTraceAsString(),
        ];

        // 记录日志
        Log::error('Exception occurred: ' . json_encode($log, JSON_PRETTY_PRINT));
    }
}

3. 使用Log类记录日志

在代码中,你可以使用Log类来记录日志。例如:

use think\facade\Log;

try {
    // 你的业务逻辑
} catch (\Exception $e) {
    Log::error('An error occurred: ' . $e->getMessage(), [
        'file' => $e->getFile(),
        'line' => $e->getLine(),
        'trace' => $e->getTraceAsString(),
    ]);
}

4. 使用debug模式

在开发环境中,建议开启debug模式,这样ThinkPHP会自动记录更多的调试信息。你可以在config/app.php中配置:

return [
    'app_debug' => true, // 开启调试模式
];

5. 使用第三方日志库

如果你需要更强大的日志功能,可以考虑使用第三方日志库,如Monolog。ThinkPHP支持集成Monolog,你可以通过Composer安装并配置。

composer require monolog/monolog

然后在config/log.php中配置Monolog驱动:

return [
    'default' => 'monolog', // 默认日志驱动
    'channels' => [
        'monolog' => [
            'type' => 'monolog',
            'handler' => \Monolog\Handler\StreamHandler::class,
            'path' => '../runtime/log/application.log',
            'level' => \Monolog\Logger::DEBUG,
        ],
    ],
];

6. 使用trace函数

ThinkPHP提供了trace函数,可以在调试模式下记录详细的调试信息。

trace('This is a debug message', 'debug');

总结

通过以上步骤,你可以在ThinkPHP中实现类似Laravel的详细异常日志记录。自定义异常处理、使用Log类、开启debug模式以及集成第三方日志库都是提升日志记录能力的有效方法。