Protokollierung und Diagnose
Das Client SDK bietet konfigurierbare Protokollierungsfunktionen, die bei der Integration, der Fehlerbehebung und der Überwachung im Produktivbetrieb helfen. Die Protokollausgabe umfasst den internen HTTP-Datenverkehr, API-Aufrufe, WebRTC-Ereignisse und den Lebenszyklus von Sitzungen.
Protokollstufen
Legen Sie die Protokollierungsstufe beim Erstellen des Clients fest. Verfügbare Stufen, von der ausführlichsten bis zur knappsten:
| Ebene | Anwendungsfall |
|---|---|
Verbose |
Vollständige Trace-Ausgabe – nützlich während der anfänglichen Integration |
Debug |
Detaillierte Diagnoseinformationen |
Info |
Allgemeine betriebliche Mitteilungen |
Warn |
Mögliche Probleme, die den Betrieb nicht beeinträchtigen |
Error |
Nur Fehler |
None |
Protokollierung deaktiviert |
Konfiguration
Sie können eine Protokollierungsstufe direkt festlegen, den internen Logger vollständig deaktivieren oder benutzerdefinierte Logger-Implementierungen bereitstellen, die die SDK-Ausgabe an Ihre eigene Protokollierungsinfrastruktur weiterleiten.
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];
Benutzerdefinierte Logger
Benutzerdefinierte Logger empfangen strukturierte Protokollereignisse mit:
- Ebene — die Schwere des Protokolleintrags
- Thema — klassifiziert die Protokollquelle (z. B.
HTTP,API,WebRTC) - Nachricht — der Inhalt des Protokolls
Verwenden Sie benutzerdefinierte Logger, um die SDK-Diagnose in Ihre bestehenden Protokollierungs- oder Absturzberichtstools (z. B. Sentry, Datadog, Crashlytics) zu integrieren.
Themenfilterung
Jeder Logger kann bestimmte Themen abonnieren, um Störsignale zu reduzieren. Zu den verfügbaren Themengruppen gehören HTTP, API, und andere. Die Filterung nach Themen ist in der Produktion nützlich, wenn Sie möglicherweise nur Ereignisse auf Netzwerkebene erfassen möchten, ohne ausführliche Protokolle zum internen Status zu erstellen.
Empfehlungen
- Verwenden Sie
Verbosewährend der Entwicklung und der ersten Integration, um den Ablauf der Aufrufe und die Reihenfolge der Ereignisse zu verstehen. - Verwenden Sie
ErroroderWarnin Produktionsversionen, um den Leistungsaufwand zu minimieren. - Wenn Sie eine Produktionsdiagnose ohne vollständige Protokollierung benötigen, verwenden Sie einen benutzerdefinierten Logger, der auf bestimmte Themen gefiltert ist.