合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
~~~ /** * 简单的文件日志 * @param $content 要写入的内容 * @param string $file 日志文件,在web 入口目录 */ function cmf_log($content, $file = "log.txt") { file_put_contents($file, $content, FILE_APPEND); } ~~~ ## 更详细的文件日志写入 ~~~ if ( ! function_exists('write_error_log')) { /** * 记录日志 * * @param mixed $errArr 日志信息(字符串或数组) * @param string $path 日志路径(相对于日志根目录) * @param string $fileFix 日志文件前缀 * @param int $backtraceLevel 回溯层级(用于记录调用位置) * * @return bool 是否写入成功 */ function write_error_log($errArr, string $path = '', string $fileFix = 'log_', int $backtraceLevel = 0): bool { try { // 格式化日志内容 $message = format_log_message($errArr); // 获取当前时间 $dateTime = date('Y-m-d H:i:s'); // 构建日志文本 $logMessage = build_log_content($message, $dateTime, $backtraceLevel); // 确保日志目录存在 $logDir = get_log_directory($path); if ( ! ensure_directory_exists($logDir)) { return false; } // 生成日志文件名 $fileName = $fileFix.date('Ymd').'.txt'; $filePath = $logDir.DIRECTORY_SEPARATOR.$fileName; // 写入日志文件 return error_log($logMessage, 3, $filePath); } catch (Exception $e) { // 避免在日志函数中再次抛出异常 return false; } } /** * 格式化日志消息 * * @param mixed $errArr * * @return string */ function format_log_message($errArr): string { if (is_array($errArr)) { return json_encode($errArr, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); } if (is_string($errArr)) { return $errArr; } if (is_object($errArr) && method_exists($errArr, '__toString')) { return (string)$errArr; } // 对于其他类型,使用 var_export 格式化 return var_export($errArr, true); } /** * 构建日志内容 * * @param string $message * @param string $dateTime * @param int $backtraceLevel * * @return string */ function build_log_content(string $message, string $dateTime, int $backtraceLevel = 0): string { $logContent = ''; $logContent .= "【{$dateTime}】".PHP_EOL; // 添加调用位置信息(如果需要) if ($backtraceLevel > 0) { $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, $backtraceLevel + 1); if (isset($backtrace[$backtraceLevel])) { $trace = $backtrace[$backtraceLevel]; $file = $trace['file'] ?? 'unknown'; $line = $trace['line'] ?? 'unknown'; $function = isset($trace['class']) ? ($trace['class'].$trace['type'].$trace['function']) : ($trace['function'] ?? 'unknown'); $logContent .= "[位置: {$file}:{$line} in {$function}]".PHP_EOL; } } $logContent .= $message.PHP_EOL; $logContent .= str_repeat('=', 50).PHP_EOL.PHP_EOL; return $logContent; } /** * 获取日志目录路径 * * @param string $path * * @return string */ function get_log_directory(string $path): string { $rootPath = root_path(); // TP6获取根目录 return $rootPath."public".DIRECTORY_SEPARATOR."log".DIRECTORY_SEPARATOR.$path; } /** * 确保目录存在 * * @param string $directory * * @return bool */ function ensure_directory_exists(string $directory): bool { if (is_dir($directory)) { return true; } return mkdir($directory, 0755, true); } } ~~~ 输出类似: ```txt ~~~ 【2025-08-29 11:24:17】 [位置: /www/huicmf_tp61_new/app/event/Logined.php:14 in write_error_log] { "admin_id": 1, "admin_name": "admin", "ip": "127.0.0.1", "user_agent": "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/139.0.0.0 Safari\/537.36 Edg\/139.0.0.0", "admin_data": { "id": 1, "username": "admin", "nickname": "超级管理员", "avatar": "", "email": "admin@admin.com", "login_failure": 0, "logintime": 1756437857, "loginip": "127.0.0.1", "login_num": {}, "create_time": "2021-11-01 17:32:42", "update_time": "2025-08-29 11:24:17", "token": "", "status": "normal", "expire_time": 1756445057 } } ================================================== ~~~ ```