import 'dart:developer' as developer; /// 串口/协议层统一日志入口 /// /// 使用 `dart:developer.log` 便于 Dart DevTools 抓取与分级。 /// 所有日志统一以 `kuaishai.device` 为 name 前缀,方便在 DevTools 中过滤。 class DeviceLog { static const String _name = 'kuaishai.device'; /// 信息级别:正常收发与状态变化 static void info(String message, {Object? error, Map? context}) { developer.log(message, name: _name, level: 800, error: error); } /// 警告级别:可恢复的异常(解析错误、写入失败等) static void warn(String message, {Object? error, Map? context}) { developer.log( message, name: _name, level: 900, error: error, // dart:developer 当前不支持直接附带 context;调用方可在 message 中拼接 ); } /// 严重级别:连接断开、协议级不可恢复错误 static void severe(String message, {Object? error, Map? context}) { developer.log(message, name: _name, level: 1000, error: error); } /// 将 Map 数据截断为可读摘要,避免在日志中泄露超长负载 static String summarizeData(Map? data, {int maxKeys = 8}) { if (data == null || data.isEmpty) return '{}'; final keys = data.keys.take(maxKeys).toList(); final shown = keys.map((k) { final v = data[k]; if (v is String) return '$k="${_truncate(v, 32)}"'; if (v is List) return '$k=[${v.length}]'; return '$k=$v'; }).join(', '); final suffix = data.length > maxKeys ? ', ...' : ''; return '{$shown$suffix}'; } static String _truncate(String s, int max) { if (s.length <= max) return s; return '${s.substring(0, max)}…'; } }