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

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

param 日志 exampleFunction 行号 838    来源:    2025-03-11

在ThinkPHP中,优雅地打印错误日志并包含函数参数、行号及原因,可以通过以下几种方式实现:

1. 使用 Log 类记录日志

ThinkPHP 提供了 Log 类来记录日志。你可以使用 Log::error() 方法来记录错误日志,并在日志中包含函数参数、行号及原因。

use think\facade\Log;

function exampleFunction($param1, $param2) {
    try {
        // 你的业务逻辑
    } catch (\Exception $e) {
        // 记录错误日志
        Log::error('Error in exampleFunction: ' . $e->getMessage(), [
            'params' => [$param1, $param2],
            'line' => __LINE__,
            'file' => __FILE__,
            'trace' => $e->getTraceAsString()
        ]);
    }
}

2. 使用 Exception 捕获异常

在捕获异常时,可以通过 Exception 对象获取更多的错误信息,并将其记录到日志中。

use think\facade\Log;

function exampleFunction($param1, $param2) {
    try {
        // 你的业务逻辑
    } catch (\Exception $e) {
        // 记录错误日志
        Log::error('Error in exampleFunction: ' . $e->getMessage(), [
            'params' => [$param1, $param2],
            'line' => $e->getLine(),
            'file' => $e->getFile(),
            'trace' => $e->getTraceAsString()
        ]);
    }
}

3. 自定义日志格式

你可以通过自定义日志格式来记录更多的信息。例如,可以在日志中添加时间戳、请求信息等。

use think\facade\Log;

function exampleFunction($param1, $param2) {
    try {
        // 你的业务逻辑
    } catch (\Exception $e) {
        // 自定义日志格式
        $logMessage = sprintf(
            "[%s] Error in %s:%d - %s\nParams: %s\nTrace: %s",
            date('Y-m-d H:i:s'),
            $e->getFile(),
            $e->getLine(),
            $e->getMessage(),
            json_encode([$param1, $param2]),
            $e->getTraceAsString()
        );

        // 记录错误日志
        Log::error($logMessage);
    }
}

4. 使用 debug_backtrace 获取调用栈信息

如果你需要更详细的调用栈信息,可以使用 debug_backtrace 函数。

use think\facade\Log;

function exampleFunction($param1, $param2) {
    try {
        // 你的业务逻辑
    } catch (\Exception $e) {
        // 获取调用栈信息
        $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 10);

        // 记录错误日志
        Log::error('Error in exampleFunction: ' . $e->getMessage(), [
            'params' => [$param1, $param2],
            'line' => $e->getLine(),
            'file' => $e->getFile(),
            'trace' => $trace
        ]);
    }
}

5. 使用 Log 类的 write 方法

如果你需要更灵活地控制日志的写入方式,可以使用 Log::write() 方法。

use think\facade\Log;

function exampleFunction($param1, $param2) {
    try {
        // 你的业务逻辑
    } catch (\Exception $e) {
        // 自定义日志内容
        $logContent = [
            'message' => $e->getMessage(),
            'params' => [$param1, $param2],
            'line' => $e->getLine(),
            'file' => $e->getFile(),
            'trace' => $e->getTraceAsString()
        ];

        // 写入日志
        Log::write(json_encode($logContent), 'error');
    }
}

总结

通过以上几种方式,你可以在ThinkPHP中优雅地打印错误日志,并包含函数参数、行号及原因。根据你的需求选择合适的方式,确保在开发和生产环境中能够快速定位和解决问题。