To log database activities, implement a logger function that accepts a SqfliteLoggerEvent and use SqfliteDatabaseFactoryLogger to wrap your existing database factory.
There are 6 types of events you can handle:
SqfliteLoggerSqlEvent: For individual SQL commands. Access sql, arguments, error, and sw (stopwatch/elapsed time).SqfliteLoggerBatchEvent: For batch operations. Iterate through event.operations to access individual operation details.SqfliteLoggerDatabaseOpenEventSqfliteLoggerDatabaseCloseEventSqfliteLoggerDatabaseDeleteEventSqfliteLoggerInvokeEvent
Use SqfliteLoggerOptions to configure the logger, setting the log callback and the type (e.g., SqfliteDatabaseFactoryLoggerType.all).
import 'package:sqflite_common/sqflite_logger.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
// 1. Define your logger function
void _logger(SqfliteLoggerEvent event) {
if (event is SqfliteLoggerSqlEvent) {
print('sql: ${event.sql}${event.arguments != null ? ' ${event.arguments}' : ''}');
} else if (event is SqfliteLoggerBatchEvent) {
for (var operation in event.operations) {
print('sql(batch): ${operation.sql}${operation.arguments != null ? ' ${operation.arguments}' : ''}');
}
}
}
// 2. Wrap your factory with SqfliteDatabaseFactoryLogger
final factoryWithLogs = SqfliteDatabaseFactoryLogger(
databaseFactoryFfi, // Your existing factory
options: SqfliteLoggerOptions(
log: _logger,
type: SqfliteDatabaseFactoryLoggerType.all,
),
);
// 3. Use the wrapped factory to open databases
var db = await factoryWithLogs.openDatabase(inMemoryDatabasePath);