Skip to content

Commit 144435e

Browse files
committed
feat: ✨ Use Logging library.
1 parent 47baad1 commit 144435e

File tree

8 files changed

+114
-43
lines changed

8 files changed

+114
-43
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"version":2,"entries":[{"package":"archethic_dapp_framework_flutter","rootUri":"../","packageUri":"lib/"}]}
1+
{"version":2,"entries":[{"package":"archethic_dapp_framework_flutter","rootUri":"../","packageUri":"lib/"},{"package":"flutter_gen","rootUri":"flutter_gen/","packageUri":"flutter_gen/"}]}

.dart_tool/flutter_gen/gen_l10n/localizations-ae-dapp-framework.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import 'package:intl/intl.dart' as intl;
88
import 'localizations-ae-dapp-framework_en.dart';
99
import 'localizations-ae-dapp-framework_fr.dart';
1010

11+
// ignore_for_file: type=lint
12+
1113
/// Callers can lookup localized strings with an instance of AppLocalizations
1214
/// returned by `AppLocalizations.of(context)`.
1315
///

.dart_tool/flutter_gen/gen_l10n/localizations-ae-dapp-framework_en.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import 'localizations-ae-dapp-framework.dart';
22

3+
// ignore_for_file: type=lint
4+
35
/// The translations for English (`en`).
46
class AppLocalizationsEn extends AppLocalizations {
57
AppLocalizationsEn([String locale = 'en']) : super(locale);

lib/archethic_dapp_framework_flutter.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export 'src/util/custom_logs.dart';
7575
export 'src/util/file_util.dart';
7676
export 'src/util/generic/get_it_instance.dart';
7777
export 'src/util/generic/providers_observer.dart';
78+
export 'src/util/logger_output.dart';
7879
export 'src/util/periodic_future.dart';
7980
export 'src/util/router_util.dart';
8081
export 'src/util/transaction_util.dart';

lib/src/util/custom_logs.dart

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,54 @@
11
/// SPDX-License-Identifier: AGPL-3.0-or-later
22
import 'dart:async';
33
import 'dart:convert';
4-
import 'dart:developer' as developer;
4+
5+
import 'package:archethic_dapp_framework_flutter/src/util/logger_output.dart';
56
import 'package:flutter/foundation.dart';
67
import 'package:http/http.dart' as http;
8+
import 'package:logging/logging.dart';
79

10+
/// Logger which sends logs to grafana.
11+
///
12+
/// Grafana logs can be disabled using [remoteLogsEnabled] flag.
13+
/// Logs are sent to the server in batches of [batchSize] every [sendInterval].
14+
///
15+
/// Logs are sent to the standard output. Visible log level can be set using [LoggerOutput.setup].
816
class LogManager {
917
LogManager({
1018
required this.url,
1119
this.sendInterval = const Duration(seconds: 60),
1220
this.batchSize = 1,
13-
this.logsActived = true,
21+
this.remoteLogsEnabled = true,
1422
}) {
1523
if (!kDebugMode) {
1624
_timer = Timer.periodic(sendInterval, (Timer t) => _sendLogs());
1725
}
1826
}
1927
final Duration sendInterval;
2028
final int batchSize;
21-
bool logsActived;
29+
bool remoteLogsEnabled;
2230
List<Map<String, dynamic>> _logQueue = [];
2331
Timer? _timer;
2432
final String url;
2533

2634
void log(
2735
String message, {
2836
String? name,
37+
Object? error,
2938
StackTrace? stackTrace,
3039
LogLevel level = LogLevel.info,
3140
}) {
32-
final timeStamp = DateTime.now().toIso8601String();
33-
if (logsActived == false) return;
41+
final _logger = Logger(name ?? 'ArchethicDApp');
42+
3443
if (message.isEmpty) return;
35-
if (kDebugMode) {
36-
if (name != null) {
37-
if (stackTrace != null) {
38-
debugPrint('$timeStamp, $message, $name, $stackTrace');
39-
} else {
40-
debugPrint('$timeStamp, $message, $name');
41-
}
42-
} else {
43-
if (stackTrace != null) {
44-
debugPrint('$timeStamp, $message, $stackTrace');
45-
} else {
46-
debugPrint('$timeStamp, $message');
47-
}
48-
}
49-
} else {
44+
_logger.log(
45+
level.toLogger,
46+
message,
47+
error,
48+
stackTrace,
49+
);
50+
if (remoteLogsEnabled && !kDebugMode) {
51+
final timeStamp = DateTime.now().toIso8601String();
5052
final logEntry = <String, dynamic>{
5153
'timestamp': timeStamp,
5254
'message': message,
@@ -64,6 +66,7 @@ class LogManager {
6466
Future<void> _sendLogs() async {
6567
if (_logQueue.isEmpty) return;
6668

69+
final _logger = Logger('ArchethicDAppLogger');
6770
try {
6871
final response = await http.post(
6972
Uri.parse(
@@ -75,12 +78,14 @@ class LogManager {
7578
if (response.statusCode == 200) {
7679
_logQueue = [];
7780
} else {
78-
developer.log(
81+
_logger.warning(
7982
'Failed to send logs to server, response status code: ${response.statusCode}',
8083
);
8184
}
8285
} catch (e) {
83-
developer.log('Error sending logs to server: $e');
86+
_logger.warning(
87+
'Error sending logs to server: $e',
88+
);
8489
}
8590
}
8691

@@ -90,3 +95,18 @@ class LogManager {
9095
}
9196

9297
enum LogLevel { debug, info, warning, error }
98+
99+
extension _LogLevelToLoggerExt on LogLevel {
100+
Level get toLogger {
101+
switch (this) {
102+
case LogLevel.debug:
103+
return Level.FINE;
104+
case LogLevel.info:
105+
return Level.INFO;
106+
case LogLevel.warning:
107+
return Level.WARNING;
108+
case LogLevel.error:
109+
return Level.SEVERE;
110+
}
111+
}
112+
}
Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
1-
import 'dart:developer';
2-
31
import 'package:flutter_riverpod/flutter_riverpod.dart';
2+
import 'package:logging/logging.dart';
43

54
class ProvidersLogger extends ProviderObserver {
6-
ProvidersLogger({this.logger = true});
5+
ProvidersLogger();
6+
7+
Logger _logger(ProviderBase<Object?> provider) => Logger(
8+
'${provider.name ?? 'Provider'}<${provider.hashCode}>',
9+
);
710

8-
final bool logger;
911
@override
1012
void didAddProvider(
1113
ProviderBase<Object?> provider,
1214
Object? value,
1315
ProviderContainer container,
1416
) {
15-
if (provider.name != null && logger) {
16-
log('didAddProvider($value)', name: '${provider.name}');
17-
}
17+
_logger(provider).fine('didAddProvider($value)');
1818
}
1919

2020
@override
@@ -24,9 +24,7 @@ class ProvidersLogger extends ProviderObserver {
2424
Object? newValue,
2525
ProviderContainer container,
2626
) {
27-
if (provider.name != null && logger) {
28-
log('didUpdateProvider($newValue)', name: '${provider.name}');
29-
}
27+
_logger(provider).fine('didUpdateProvider($newValue)');
3028
}
3129

3230
@override
@@ -36,15 +34,11 @@ class ProvidersLogger extends ProviderObserver {
3634
StackTrace stackTrace,
3735
ProviderContainer container,
3836
) {
39-
if (provider.name != null && logger) {
40-
log('providerDidFail($error)', name: '${provider.name}');
41-
}
37+
_logger(provider).fine('providerDidFail($error)');
4238
}
4339

4440
@override
4541
void didDisposeProvider(ProviderBase provider, ProviderContainer container) {
46-
if (provider.name != null && logger) {
47-
log('didDisposeProvider', name: '${provider.name}');
48-
}
42+
_logger(provider).fine('didDisposeProvider');
4943
}
5044
}

lib/src/util/logger_output.dart

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// ignore_for_file: avoid_print
2+
3+
import 'dart:developer' as dev;
4+
5+
import 'package:flutter/foundation.dart';
6+
import 'package:logging/logging.dart';
7+
8+
/// [LoggerOutput] is used to fine tune log level sent to standard output.
9+
class LoggerOutput {
10+
static void setup({Level? level}) {
11+
Logger.root.level = level ?? (kDebugMode ? Level.ALL : Level.SEVERE);
12+
13+
/// Note : When in debug mode, logs are displayed
14+
/// in debug console. There is no need to register log listeners.
15+
if (!kDebugMode) {
16+
_registerLogListeners();
17+
}
18+
}
19+
20+
static void _registerLogListeners() {
21+
Logger.root.clearListeners();
22+
23+
if (kIsWeb) {
24+
Logger.root.onRecord.listen((event) {
25+
print(
26+
'${event.time.toIso8601String()} [${event.loggerName}] ${event.message}',
27+
);
28+
if (event.error != null) {
29+
print('\t${event.error}');
30+
}
31+
if (event.stackTrace != null) {
32+
print('\t${event.stackTrace}');
33+
}
34+
});
35+
}
36+
37+
if (!kIsWeb) {
38+
Logger.root.onRecord.listen((event) {
39+
dev.log(
40+
event.message,
41+
name: event.loggerName,
42+
error: event.error,
43+
stackTrace: event.stackTrace,
44+
level: event.level.value,
45+
time: event.time,
46+
sequenceNumber: event.sequenceNumber,
47+
zone: event.zone,
48+
);
49+
});
50+
}
51+
}
52+
}

pubspec.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -580,18 +580,18 @@ packages:
580580
dependency: transitive
581581
description:
582582
name: material_color_utilities
583-
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
583+
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
584584
url: "https://pub.dev"
585585
source: hosted
586-
version: "0.8.0"
586+
version: "0.11.1"
587587
meta:
588588
dependency: transitive
589589
description:
590590
name: meta
591-
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
591+
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
592592
url: "https://pub.dev"
593593
source: hosted
594-
version: "1.12.0"
594+
version: "1.15.0"
595595
mime:
596596
dependency: transitive
597597
description:

0 commit comments

Comments
 (0)