import 'package:flutter/foundation.dart'; // kDebugMode, debugPrint
import 'package:logging/logging.dart';
import 'package:stream_chat/stream_chat.dart';
final client = StreamChatClient(
'YOUR_API_KEY',
logLevel: kDebugMode ? Level.ALL : Level.WARNING, // default is Level.WARNING
logHandlerFunction: (LogRecord record) {
debugPrint(
'${record.time} '
'[${record.level.name}] '
'${record.loggerName}: ${record.message}',
);
if (record.error != null) debugPrint(' error: ${record.error}');
if (record.stackTrace != null) debugPrint(' trace: ${record.stackTrace}');
},
);Logging
Stream Chat builds detached loggers internally. Attach your log handler via logHandlerFunction: on the client constructor. Listeners on Logger.root will not receive any stream_chat records.
The default handler is
StreamChatClient.defaultLogHandler, which prints with emoji level prefixes. Provide your ownlogHandlerFunctiononly when you need to route to a different sink (Sentry, Crashlytics, etc.).
Sentry integration
import 'package:logging/logging.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:stream_chat/stream_chat.dart';
void _sentryLogHandler(LogRecord record) {
final sentryLevel = switch (record.level) {
Level.SHOUT || Level.SEVERE => SentryLevel.fatal,
Level.WARNING => SentryLevel.warning,
Level.INFO || Level.CONFIG => SentryLevel.info,
_ => SentryLevel.debug,
};
Sentry.captureMessage(
'[${record.loggerName}] ${record.message}',
level: sentryLevel,
);
if (record.error case final error?) {
Sentry.captureException(error, stackTrace: record.stackTrace);
}
}
final client = StreamChatClient(
'YOUR_API_KEY',
logLevel: Level.INFO,
logHandlerFunction: _sentryLogHandler,
);