A library that provides nesseary classes to implement logging functionality in flutter app
We will need to add following in the pubspec.yaml file in dependency section
flutter_logger:
git:
url: git@bitbucket.org:vivacomsolution/flutter_logger.git
ref: master
enum LoggerLevel {
verbose,
debug,
info,
warning,
error,
}We have our own logging level so that we can handle logging, This solves the problem of tight coupling with thrid party library.
class VLogger {
final FlutterLoggerClient _client;
VLogger(this._client);
void debug(String message, [Object? error, StackTrace? stackTrace]) {
_client.log(LoggerLevel.debug, message, error, stackTrace);
}
void info(String message, [Object? error, StackTrace? stackTrace]) {
_client.log(LoggerLevel.info, message, error, stackTrace);
}
void error(String message, [Object? error, StackTrace? stackTrace]) {
_client.log(LoggerLevel.error, message, error, stackTrace);
}
void verbose(String message, [Object? error, StackTrace? stackTrace]) {
_client.log(LoggerLevel.verbose, message, error, stackTrace);
}
void warning(String message, [Object? error, StackTrace? stackTrace]) {
_client.log(LoggerLevel.warning, message, error, stackTrace);
}
}we will use directly abvoe VLogger class to log whatever we want to log. We will need to provide an implementation of FlutterLoggerClient class. And this class looks like following.
abstract class FlutterLoggerClient{
void log(LoggerLevel level, String message, [Object? error, StackTrace? stackTrace] );
}This is the interface or contract how logger is implemented. As we can have different implementations of FlutterLoggerClient. Let's look on some implementation class of this FlutterLoggerClient interface.
class ConsoleLoggerClient extends FlutterLoggerClient {
late final Logger _instance;
ConsoleLoggerClient({
required Logger logger
}){
_instance = logger;
Logger.level = Level.verbose;
}
@override
void log(LoggerLevel level, String message, [Object? error, StackTrace? stackTrace]) {
if(level == LoggerLevel.verbose){
_instance.v(message,error,stackTrace);
}
else if(level == LoggerLevel.debug){
_instance.d(message,error,stackTrace);
}
else if(level == LoggerLevel.info){
_instance.i(message,error,stackTrace);
}
else if(level == LoggerLevel.warning){
_instance.w(message,error,stackTrace);
}
else if(level == LoggerLevel.error){
_instance.e(message,error,stackTrace);
}
}
} ConsoleLoggerClient simply will log in console. Here we have used a thirdy party library named logger that provides some pretty logging opurtunity in console. The same way we have FileLoggerClient where can specify where to log and log printer.
class ProdLogger implements FlutterLoggerClient {
late FlutterLoggerClient _vivaLoggerClient;
late LogSettingsProvider _logSettingsProvider;
ProdLogger(FlutterLoggerClient vivaLoggerClient,
LogSettingsProvider logSettingsProvider) {
_vivaLoggerClient = vivaLoggerClient;
_logSettingsProvider = logSettingsProvider;
}
@override
void log(LoggerLevel level, String message,
[Object? error, StackTrace? stackTrace]) {
if (_logSettingsProvider.isLogEnable() == false ||
_logSettingsProvider.logLevel().index > level.index) {
return;
}
_vivaLoggerClient.log(level, message, error, stackTrace);
}
}
Here in the ProdLogger we have used decoration desing pattern to add behaviour in the logging functionality. So , we can here specify loggging client along with our preffered Log settings.