Skip to Content

Logging

Fasq Riverpod makes it easy to monitor your application’s data flow using the built-in FasqLogger.

The Default Logger

fasq_riverpod provides a fasqLoggerProvider that gives you a pre-configured instance of FasqLogger. This logger automatically hooks into the QueryClient lifecycle to log events like fetches, successes, and errors.

Setup

To enable logging, add the logger to the fasqObserversProvider via an override in your ProviderScope:

import 'package:fasq/fasq.dart'; import 'package:fasq_riverpod/fasq_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; void main() { runApp( ProviderScope( overrides: [ fasqObserversProvider.overrideWith((ref) => [ // Use the default logger ref.watch(fasqLoggerProvider), ]), ], child: MyApp(), ), ); }

Configuration

You can customize the logger by overriding fasqLoggerProvider:

ProviderScope( overrides: [ fasqLoggerProvider.overrideWithValue( FasqLogger( // Disable logging entirely enabled: !kReleaseMode, // Show data in logs (privacy-first: false by default) showData: true, // Truncate long data strings truncateLength: 50, ), ), ], child: MyApp(), )

Log Format

The logger uses emoji-coded messages for easy scanning in your console:

  • [Fetch]: A query or mutation has started.
  • [Success]: A query or mutation completed successfully.
  • [Error]: A query or mutation failed.
  • 🚀 [Mutation]: A mutation has started.

Example Console Output

⏳ [Fetch] user:123 ✅ [Success] user:123 (150ms) {"id": 123, "name": "John"}

Privacy-First Logging

By default, FasqLogger does not log the data returned by your queries. This ensures that sensitive information is not leaked into your production logs.

Only enable showData: true during local development or when debugging specific issues.

Custom Observers

If you need more advanced logging (e.g., sending logs to a remote service), you can implement your own QueryClientObserver and add it to fasqObserversProvider:

class MyAnalyticsObserver extends QueryClientObserver { @override void onQuerySuccess(QuerySnapshot snapshot, QueryMeta? meta, BuildContext? context) { // Send event to analytics service analytics.logEvent('query_success', {'key': snapshot.key.toString()}); } }

Then register it:

overrides: [ fasqObserversProvider.overrideWith((ref) => [ ref.watch(fasqLoggerProvider), // Include default logger MyAnalyticsObserver(), // Add your custom observer ]), ]

See Also

Last updated on