插件窝 干货文章 ThinkPHP如何优雅打印错误日志:包含参数、行号和原因?

ThinkPHP如何优雅打印错误日志:包含参数、行号和原因?

日志 行号 记录 可以 529    来源:    2025-03-14

在ThinkPHP中,优雅地打印错误日志可以帮助开发者快速定位和解决问题。你可以通过以下步骤来实现包含参数、行号和原因的日志记录:

1. 使用 Log 类记录日志

ThinkPHP 提供了 Log 类来记录日志。你可以在需要记录日志的地方调用 Log::record()Log::write() 方法。

2. 获取错误信息

你可以使用 debug_backtrace() 函数来获取当前调用栈的信息,包括文件名、行号等。

3. 记录参数

在记录日志时,可以将相关参数一并记录下来,方便排查问题。

4. 示例代码

以下是一个示例代码,展示了如何优雅地记录错误日志:

use think\facade\Log;

function logError($message, $params = []) {
    // 获取调用栈信息
    $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
    $file = $backtrace[0]['file'] ?? 'unknown';
    $line = $backtrace[0]['line'] ?? 0;

    // 构造日志信息
    $logMessage = sprintf(
        "Error in %s on line %d: %s\nParams: %s",
        $file,
        $line,
        $message,
        json_encode($params, JSON_PRETTY_PRINT)
    );

    // 记录日志
    Log::record($logMessage, 'error');
}

// 示例调用
try {
    // 你的业务逻辑
    $params = ['param1' => 'value1', 'param2' => 'value2'];
    // 假设这里发生了错误
    throw new Exception("Something went wrong");
} catch (Exception $e) {
    logError($e->getMessage(), $params);
}

5. 日志输出

日志会被记录到 runtime/log 目录下的日志文件中,文件名通常是 YYYY-MM-DD.log。日志内容会包含错误信息、文件名、行号以及参数。

6. 日志级别

Log::record() 的第二个参数是日志级别,常用的级别有 errorinfodebug 等。你可以根据需要选择合适的日志级别。

7. 日志配置

你可以在 config/log.php 中配置日志的行为,例如日志的存储方式、日志文件的命名规则等。

8. 日志格式化

如果你希望日志格式更加统一,可以在 logError 函数中对日志信息进行进一步格式化,例如添加时间戳、请求ID等。

9. 使用 Monolog

如果你需要更强大的日志功能,可以考虑使用 Monolog 库。ThinkPHP 也支持集成 Monolog,你可以在 config/log.php 中配置 Monolog 作为日志驱动。

10. 总结

通过以上方法,你可以在 ThinkPHP 中优雅地记录错误日志,包含参数、行号和原因,从而更高效地排查和解决问题。