en_logger 1.3.0
en_logger: ^1.3.0 copied to clipboard
EnLogger allows you to write log messages according to your needs without restricting you to writing messages to the debug console or other systems.
// ignore_for_file: avoid_print just for the example
import 'dart:convert';
import 'package:en_logger/en_logger.dart';
import 'package:sentry/sentry.dart';
void main(List<String> args) async {
// a custom handler that under the hood use sentry
final sentry = await SentryHandler.init();
// default printer configured
final printer = PrinterHandler()
..configure({
Severity.notice: const PrinterColor.green(),
});
// an enLogger with a default prefix format
final logger = EnLogger(
defaultPrefixFormat: const PrefixFormat(
startFormat: '[',
endFormat: ']',
),
)
..addHandlers([
sentry,
printer,
])
// debug log
..debug('a debug message')
// error with data
..error(
'error',
data: [
EnLoggerData(
name: 'response',
content: jsonEncode('BE data'),
description: 'serialized BE response',
),
],
);
// logger instance with prefix
logger.getConfiguredInstance(prefix: 'API Repository')
// [API Repository] a debug message
..debug('a debug message')
// [Custom prefix] a debug message
..error(
'error',
prefix: 'Custom prefix',
);
// Lazy: closure is only run if at least one handler will write
// (e.g. can(severity) is true)
logger
..lazyDebug(() => 'expensive debug message')
..lazyError(() => 'error from sync computation')
// lazy callback can be asynchronous
..lazyInfo(() async {
await Future<void>.delayed(const Duration(milliseconds: 10));
return 'heavy computation';
});
// close the logger
// wait for all pending logs to be written before closing the logger
await logger.close();
// logger is closed, so this message won't be written
logger.debug('a debug message');
print(logger.closed); // true
}
class SentryHandler extends EnLoggerHandler {
SentryHandler._();
static Future<SentryHandler> init() async {
await Sentry.init(
(options) {
options.dsn = 'https://example@sentry.io/example';
},
);
return SentryHandler._();
}
@override
void write(
String message, {
required Severity severity,
String? prefix,
StackTrace? stackTrace,
List<EnLoggerData>? data,
}) {
// just a simple example
// fine tune your implementation...
if (severity.atLeastError) {
Sentry.captureException(message, stackTrace: stackTrace);
return;
}
Sentry.captureMessage(message);
}
}