Registros y diagnósticos
El Client SDK ofrece un sistema de registro configurable que facilita la integración, la depuración y la supervisión en producción. Los registros incluyen el tráfico HTTP interno, las llamadas a la API, los eventos WebRTC y el ciclo de vida de las sesiones.
Niveles de registro
Configura el nivel de registro al crear el cliente. Niveles disponibles, de mayor a menor detalle:
| Nivel | Caso práctico |
|---|---|
Verbose |
Salida de seguimiento completa: útil durante la integración inicial |
Debug |
Información diagnóstica detallada |
Info |
Mensajes operativos generales |
Warn |
Posibles problemas que no impiden el funcionamiento |
Error |
Solo fallos |
None |
Registro desactivado |
Configuración
Puedes establecer directamente un nivel de registro, desactivar por completo el registrador interno o proporcionar implementaciones personalizadas del registrador que desvíen la salida del SDK hacia tu propia infraestructura de registro.
const clientA = new VonageClient({
loggingLevel: LoggingLevel.Error
});
// or setup custom loggers
const clientB = new VonageClient({
disableInternalLogger: true,
customLoggers: [
{
name: 'CustomLoggerOne',
minLogLevel: LoggingLevel.Debug,
topics: ['HTTP', Topics.API],
onLog: (level, topic, message) => {
console.log(`${level} ${topic.name} ${topic.tag} ${message}`);
}
},
createVonageLogger('CustomLoggerTwo', (level, topic, message) => {
console.log(`${level} ${topic.name} ${topic.tag} ${message}`);
})
]
});
val config = VGClientInitConfig(LoggingLevel.Verbose)
val clientA = VonageClient(ctx, config)
// or
val clientB = VonageClient(
ctx,
VGClientInitConfig().apply {
loggingLevel = LoggingLevel.Error
}
)
// or setup custom loggers
val clientC = VonageClient(
ctx,
VGClientInitConfig(
disableInternalLogger = true,
customLoggers = listOf(
object : VonageLogger {
override val name: String = "CustomLoggerOne"
override val minLogLevel: LoggingLevel = LoggingLevel.Debug
override val topics: List<Topic> = listOf(Topic.HTTP, Topic.API).flatten()
override fun onLog(logLevel: LoggingLevel, topic: Topic, message: String, throwable: Throwable?) {
println("$logLevel ${topic.name} ${topic.tag} $message")
}
},
createVonageLogger("CustomLoggerTwo"){ logLevel, topic, message, _ ->
println("$logLevel ${topic.name} ${topic.tag} $message")
}
)
)
)
LoggingLevel logLevelA = LoggingLevel.Verbose;
VGClientInitConfig configA = new VGClientInitConfig(logLevelA);
VonageClient clientA = VonageClient.createClient(ctx, configA);
// or
VGClientInitConfig configB = new VGClientInitConfig();
configB.setLoggingLevel(LoggingLevel.Error);
VonageClient clientB = VonageClient.createClient(ctx, configB);
// or setup custom loggers
VGClientInitConfig configC = new VGClientInitConfig();
configC.setDisableInternalLogger(true);
configC.setCustomLoggers(Arrays.asList(
new VonageLogger() {
@NotNull
@Override
public String getName() {
return "CustomLoggerOne";
}
@NotNull
@Override
public LoggingLevel getMinLogLevel() {
return LoggingLevel.Debug;
}
@NotNull
@Override
public List<Topic> getTopics() {
List<Topic> flattenedList = new ArrayList<>();
for (List<? extends Topic> subList : Arrays.asList(Topic.Companion.getHTTP(), Topic.Companion.getAPI())) {
flattenedList.addAll(subList);
}
return flattenedList;
}
@Override
public void onLog(@NotNull LoggingLevel logLevel, @NotNull Topic topic, @NotNull String message, Throwable throwable) {
System.out.println(logLevel + " " + topic.getName() + " " + topic.getTag() + " " + message);
}
},
createVonageLogger(
"CustomLoggerTwo",
null, null,
(logLevel, topic, message, throwable) -> {
System.out.println(logLevel + " " + topic.getName() + " " + topic.getTag() + " " + message);
return null;
}
)
));
VonageClient clientC = VonageClient.createClient(ctx, configC);
let configA = VGClientInitConfig(loggingLevel: .verbose)
let clientA = VGVonageClient(configA)
// or
let configB = VGClientInitConfig()
configB.loggingLevel = .error
let clientB = VGVonageClient(configB)
// or setup custom loggers
class MyLogger : NSObject, VGLogger {
let name: String = "CustomLoggerOne"
let minLogLevel: VGLoggingLevel = .debug
let topics: [VGTopicGroup] = [VGTopic.HTTP, VGTopic.API]
func didReceiveLog(logLevel: VGLoggingLevel, topic: VGTopic, message: String) {
print("\(logLevel) \(topic.name) \(topic.tag) \(message)")
}
}
let clientC = VGVonageClient(
VGClientInitConfig(
disableInternalLogger: true,
customLoggers: [
MyLogger(),
VGCustomLogger("CustomLoggerTwo"){ logLevel,topic, message in
print("\(logLevel) \(topic.name) \(topic.tag) \(message)")
}
]
)
)
VGClientInitConfig *configA = [[VGClientInitConfig alloc]
initWithLoggingLevel:VGLoggingLevelVerbose
disableInternalLogger:VGDefaultDisableInternalLogger
customLoggers:[NSArray array]
region:VGDefaultRegion
apiUrl:nil
websocketUrl:nil
websocketPath:nil
enableWebSocketInvites:VGDefaultEnableWebsocketInvites
rtcStatsTelemetry:VGDefaultRtcStatsTelemetry
autoReconnectMedia:VGDefaultAutoReconnectMedia
enableNoiseSuppression:VGDefaultEnableNoiseSuppression
emergencyPrimaryRegion:nil
emergencySecondaryRegion:nil];
VGVonageClient* clientA = [[VGVonageClient alloc] initWithConfig:configA];
// or
VGClientInitConfig *configB = [[VGClientInitConfig alloc] init];
configB.loggingLevel = VGLoggingLevelError;
VGVonageClient* clientB = [[VGVonageClient alloc] initWithConfig:configB];
// or setup custom loggers
// 1. Implement the VGLogger protocol
id<VGLogger> customLoggerOne;
// 2. Use the VGCustomLogger class
VGCustomLogger *customLoggerTwo = [[VGCustomLogger alloc]
initWithName:@"CustomLoggerTwo"
minLogLevel:VGDefaultLoggingLevel()
topics:VGDefaultTopics()
onLog:^(VGLoggingLevel logLevel, VGTopic * _Nonnull topic, NSString * _Nonnull message) {
NSLog(@"%ld %@ %@ %@", logLevel, topic.name, topic.tag, message);
}];
VGClientInitConfig *configC = [[VGClientInitConfig alloc] init];
configC.disableInternalLogger = true;
configC.customLoggers = [NSArray arrayWithObjects:customLoggerOne, customLoggerTwo, nil];
VGVonageClient *clientC = [[VGVonageClient alloc] initWithConfig:configC];
Registradores personalizados
Los registradores personalizados reciben eventos de registro estructurados que incluyen:
- nivel — la gravedad de la entrada del registro
- tema — clasifica la fuente del registro (p. ej.,
HTTP,API,WebRTC) - mensaje — el contenido del registro
Utiliza registradores personalizados para integrar los diagnósticos del SDK con tus herramientas actuales de registro o de notificación de fallos (por ejemplo, Sentry, Datadog, Crashlytics).
Filtrado por temas
Cada registrador puede suscribirse a temas específicos para reducir el ruido. Entre los grupos de temas disponibles se incluyen: HTTP, API, entre otros. Filtrar por tema resulta útil en entornos de producción, donde quizá solo se desee capturar eventos a nivel de red sin un registro detallado del estado interno.
Recomendaciones
- Uso
Verbosedurante el desarrollo y la integración inicial, para comprender el flujo de llamadas y el orden de los eventos. - Uso
ErroroWarnen las versiones de producción para minimizar la merma de rendimiento. - Si necesitas un diagnóstico de producción sin un nivel de detalle completo, utiliza un registrador personalizado filtrado por temas específicos.