设计思路
- 创建日志管理器:设计一个单例的日志管理器,负责统一处理所有网络请求的日志记录。
- 区分服务:在日志记录中添加服务标识,以便区分不同的API服务。
- 认证方式处理:针对不同认证方式,在日志记录中明确记录认证信息,但需注意对敏感信息进行加密或隐藏处理,保证安全性。
- 日志准确性:记录请求和响应的完整信息,包括URL、请求头、请求体、响应状态码、响应体等。
关键代码
- 定义日志管理器单例
class NetworkLogManager {
static final NetworkLogManager _instance = NetworkLogManager._internal();
factory NetworkLogManager() => _instance;
NetworkLogManager._internal();
void logRequest(String serviceName, String url, Map<String, String> headers,
dynamic body, String authType) {
// 隐藏敏感信息,例如对JWT进行部分隐藏处理
String maskedAuth = _maskAuthInfo(authType, headers);
String logMessage =
"Service: $serviceName\nURL: $url\nHeaders: $headers\nBody: $body\nAuth: $maskedAuth";
print(logMessage);
}
void logResponse(String serviceName, int statusCode, dynamic responseBody) {
String logMessage =
"Service: $serviceName\nStatus Code: $statusCode\nResponse Body: $responseBody";
print(logMessage);
}
String _maskAuthInfo(String authType, Map<String, String> headers) {
if (authType == 'JWT') {
String jwt = headers['Authorization']?.split(' ').last?? '';
return 'JWT ${jwt.substring(0, 5)}...';
} else if (authType == 'OAuth') {
return 'OAuth [masked]';
}
return 'Unknown';
}
}
- 使用日志管理器
// 在网络请求处调用日志记录
Future<dynamic> makeRequest(String serviceName, String url,
Map<String, String> headers, dynamic body, String authType) async {
NetworkLogManager().logRequest(serviceName, url, headers, body, authType);
// 实际的网络请求代码,这里假设使用http包
try {
var response = await http.post(Uri.parse(url), headers: headers, body: body);
NetworkLogManager().logResponse(serviceName, response.statusCode, response.body);
return response.body;
} catch (e) {
NetworkLogManager().logResponse(serviceName, -1, e.toString());
return null;
}
}