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

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

日志 param 行号 记录 43    来源:    2025-03-14

在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' => $param1, 'param2' => $param2],
            'line' => __LINE__,
            'file' => __FILE__,
            'trace' => $e->getTraceAsString()
        ]);
    }
}

2. 使用 Exception 类捕获异常

你可以在捕获异常时,将异常信息、函数参数、行号等信息记录到日志中。

use think\facade\Log;

function exampleFunction($param1, $param2) {
    try {
        // 你的业务逻辑
    } catch (\Exception $e) {
        // 记录错误日志
        Log::error(sprintf(
            "Error in %s on line %d: %s\nParams: %s\nTrace: %s",
            __FILE__,
            __LINE__,
            $e->getMessage(),
            json_encode(['param1' => $param1, 'param2' => $param2]),
            $e->getTraceAsString()
        ));
    }
}

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

如果你想在日志中包含调用栈信息,可以使用 debug_backtrace 函数。

use think\facade\Log;

function exampleFunction($param1, $param2) {
    try {
        // 你的业务逻辑
    } catch (\Exception $e) {
        // 获取调用栈信息
        $trace = debug_backtrace();
        $traceInfo = array_map(function($trace) {
            return sprintf(
                "File: %s, Line: %d, Function: %s",
                $trace['file'] ?? '',
                $trace['line'] ?? '',
                $trace['function'] ?? ''
            );
        }, $trace);

        // 记录错误日志
        Log::error(sprintf(
            "Error in %s on line %d: %s\nParams: %s\nTrace: %s",
            __FILE__,
            __LINE__,
            $e->getMessage(),
            json_encode(['param1' => $param1, 'param2' => $param2]),
            implode("\n", $traceInfo)
        ));
    }
}

4. 使用 Log 类的 write 方法

你也可以直接使用 Log::write() 方法,手动记录日志。

use think\facade\Log;

function exampleFunction($param1, $param2) {
    try {
        // 你的业务逻辑
    } catch (\Exception $e) {
        // 记录错误日志
        Log::write(sprintf(
            "Error in %s on line %d: %s\nParams: %s\nTrace: %s",
            __FILE__,
            __LINE__,
            $e->getMessage(),
            json_encode(['param1' => $param1, 'param2' => $param2]),
            $e->getTraceAsString()
        ), 'error');
    }
}

5. 配置日志格式

你还可以通过配置日志格式,使日志输出更加规范。在 config/log.php 中配置日志格式:

return [
    // 日志记录方式
    'type'  => 'File',
    // 日志保存目录
    'path'  => '',
    // 日志记录级别
    'level' => [],
    // 单文件日志写入
    'single' => false,
    // 独立日志级别
    'apart_level' => [],
    // 最大日志文件数量
    'max_files'   => 0,
    // 是否关闭日志写入
    'close'       => false,
    // 日志输出格式化
    'format'      => '[%s][%s] %s', // 自定义日志格式
];

总结

通过以上方法,你可以在ThinkPHP中优雅地打印错误日志,并包含函数参数、行号及原因。根据实际需求选择合适的方式,确保日志信息完整且易于排查问题。