From 15ff26acf1086e0eb305369a9f11749f64bf6d18 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Wed, 8 Feb 2023 16:36:51 +0100 Subject: [PATCH 01/30] Updated repository links and added acknowledgment --- LICENSE | 1 + README.md | 38 +++++++++----------------------------- pubspec.yaml | 2 +- 3 files changed, 11 insertions(+), 30 deletions(-) diff --git a/LICENSE b/LICENSE index 4827a51..8b0e45c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,7 @@ MIT License Copyright (c) 2019 Simon Leier +Copyright (c) 2023 Severin Hamader Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 82c7acd..8dde5e0 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # Logger [![pub package](https://img.shields.io/pub/v/logger.svg?logo=dart&logoColor=00b9fc)](https://pub.dartlang.org/packages/logger) -[![CI](https://img.shields.io/github/workflow/status/leisim/logger/Dart%20CI/master?logo=github-actions&logoColor=white)](https://github.com/leisim/logger/actions) -[![Last Commits](https://img.shields.io/github/last-commit/leisim/logger?logo=git&logoColor=white)](https://github.com/leisim/logger/commits/master) -[![Pull Requests](https://img.shields.io/github/issues-pr/leisim/logger?logo=github&logoColor=white)](https://github.com/leisim/logger/pulls) -[![Code size](https://img.shields.io/github/languages/code-size/leisim/logger?logo=github&logoColor=white)](https://github.com/leisim/logger) -[![License](https://img.shields.io/github/license/leisim/logger?logo=open-source-initiative&logoColor=green)](https://github.com/leisim/logger/blob/master/LICENSE) +[![CI](https://img.shields.io/github/workflow/status/Bungeefan/logger/Dart%20CI/master?logo=github-actions&logoColor=white)](https://github.com/Bungeefan/logger/actions) +[![Last Commits](https://img.shields.io/github/last-commit/Bungeefan/logger?logo=git&logoColor=white)](https://github.com/Bungeefan/logger/commits/master) +[![Pull Requests](https://img.shields.io/github/issues-pr/Bungeefan/logger?logo=github&logoColor=white)](https://github.com/Bungeefan/logger/pulls) +[![Code size](https://img.shields.io/github/languages/code-size/Bungeefan/logger?logo=github&logoColor=white)](https://github.com/Bungeefan/logger) +[![License](https://img.shields.io/github/license/Bungeefan/logger?logo=open-source-initiative&logoColor=green)](https://github.com/Bungeefan/logger/blob/master/LICENSE) Small, easy to use and extensible logger which prints beautiful logs.
Inspired by [logger](https://github.com/orhanobut/logger) for Android. @@ -15,7 +15,7 @@ Inspired by [logger](https://github.com/orhanobut/logger) for Android. ### Resources: - [Documentation](https://pub.dev/documentation/logger/latest/logger/logger-library.html) - [Pub Package](https://pub.dev/packages/logger) -- [GitHub Repository](https://github.com/leisim/logger) +- [GitHub Repository](https://github.com/Bungeefan/logger) ## Getting Started @@ -30,7 +30,7 @@ Instead of a string message, you can also pass other objects like `List`, `Map` ## Output -![](https://raw.githubusercontent.com/leisim/logger/master/art/screenshot.png) +![](https://raw.githubusercontent.com/Bungeefan/logger/master/art/screenshot.png) # Documentation @@ -171,26 +171,6 @@ Possible future `LogOutput`s could send to a file, firebase or to Logcat. Feel f The [logger_flutter](https://pub.dev/packages/logger_flutter) package is an extension for logger. You can add it to any Flutter app. Just shake the phone to show the console. +# Acknowledgments -## MIT License -``` -Copyright (c) 2019 Simon Leier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` +This package was originally created by [Simon Choi](https://github.com/simc). diff --git a/pubspec.yaml b/pubspec.yaml index f0a021e..0b84b90 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: logger description: Small, easy to use and extensible logger which prints beautiful logs. version: 1.1.0 -homepage: https://github.com/leisim/logger +repository: https://github.com/Bungeefan/logger environment: sdk: ">=2.12.0 <3.0.0" From e6d84b6b144a2e7be94ecc1439e42cc59359d105 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Wed, 8 Feb 2023 16:53:44 +0100 Subject: [PATCH 02/30] Revert "Remove callbacks" This reverts commit 8dae0e81ae495bcbe5cf5408c8c81291fa45be42. --- lib/src/logger.dart | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/lib/src/logger.dart b/lib/src/logger.dart index 9378662..dcd8eac 100644 --- a/lib/src/logger.dart +++ b/lib/src/logger.dart @@ -1,9 +1,9 @@ import 'package:logger/src/filters/development_filter.dart'; -import 'package:logger/src/printers/pretty_printer.dart'; -import 'package:logger/src/outputs/console_output.dart'; import 'package:logger/src/log_filter.dart'; -import 'package:logger/src/log_printer.dart'; import 'package:logger/src/log_output.dart'; +import 'package:logger/src/log_printer.dart'; +import 'package:logger/src/outputs/console_output.dart'; +import 'package:logger/src/printers/pretty_printer.dart'; /// [Level]s to control logging output. Logging can be enabled to include all /// levels above certain [Level]. @@ -33,10 +33,8 @@ class OutputEvent { OutputEvent(this.level, this.lines); } -@Deprecated('Use a custom LogFilter instead') typedef LogCallback = void Function(LogEvent event); -@Deprecated('Use a custom LogOutput instead') typedef OutputCallback = void Function(OutputEvent event); /// Use instances of logger to send log messages to the [LogPrinter]. @@ -46,6 +44,10 @@ class Logger { /// All logs with levels below this level will be omitted. static Level level = Level.verbose; + static final Set _logCallbacks = {}; + + static final Set _outputCallbacks = {}; + final LogFilter _filter; final LogPrinter _printer; final LogOutput _output; @@ -112,6 +114,9 @@ class Logger { } var logEvent = LogEvent(level, message, error, stackTrace); if (_filter.shouldLog(logEvent)) { + for (var callback in _logCallbacks) { + callback(logEvent); + } var output = _printer.log(logEvent); if (output.isNotEmpty) { @@ -119,6 +124,9 @@ class Logger { // Issues with log output should NOT influence // the main software behavior. try { + for (var callback in _outputCallbacks) { + callback(outputEvent); + } _output.output(outputEvent); } catch (e, s) { print(e); @@ -135,4 +143,28 @@ class Logger { _printer.destroy(); _output.destroy(); } + + /// Register a [LogCallback] which is called for each new [LogEvent]. + static void addLogListener(LogCallback callback) { + _logCallbacks.add(callback); + } + + /// Removes a [LogCallback] which was previously registered. + /// + /// Returns whether the callback was successfully removed. + static bool removeLogListener(LogCallback callback) { + return _logCallbacks.remove(callback); + } + + /// Register an [OutputCallback] which is called for each new [OutputEvent]. + static void addOutputListener(OutputCallback callback) { + _outputCallbacks.add(callback); + } + + /// Removes a [OutputCallback] which was previously registered. + /// + /// Returns whether the callback was successfully removed. + static void removeOutputListener(OutputCallback callback) { + _outputCallbacks.remove(callback); + } } From bf2c13c30fdd9f8752748d938d23a6b81c5bcc31 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Wed, 8 Feb 2023 17:13:51 +0100 Subject: [PATCH 03/30] Replaced pedantic with lints --- analysis_options.yaml | 5 +++- lib/logger.dart | 24 +++++++---------- lib/src/ansi_color.dart | 2 +- lib/src/filters/development_filter.dart | 2 +- lib/src/filters/production_filter.dart | 2 +- lib/src/log_filter.dart | 1 + lib/src/outputs/console_output.dart | 2 +- lib/src/outputs/file_output.dart | 2 +- lib/src/outputs/memory_output.dart | 2 +- lib/src/outputs/multi_output.dart | 13 ++++++--- lib/src/outputs/stream_output.dart | 2 +- lib/src/printers/hybrid_printer.dart | 35 ++++++++++++++----------- lib/src/printers/prefix_printer.dart | 4 +-- lib/src/printers/pretty_printer.dart | 22 +++++++++------- lib/src/printers/simple_printer.dart | 4 +-- pubspec.yaml | 2 +- test/printers/prefix_printer_test.dart | 16 +++++------ test/printers/pretty_printer_test.dart | 12 ++++----- 18 files changed, 82 insertions(+), 70 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index d4fcc1a..12e713a 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1 +1,4 @@ -include: package:pedantic/analysis_options.yaml \ No newline at end of file +include: package:lints/recommended.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/lib/logger.dart b/lib/logger.dart index c5f3951..10337f3 100644 --- a/lib/logger.dart +++ b/lib/logger.dart @@ -2,25 +2,19 @@ library logger; export 'src/ansi_color.dart'; - export 'src/filters/development_filter.dart'; export 'src/filters/production_filter.dart'; - +export 'src/log_filter.dart'; +export 'src/log_output.dart' + if (dart.library.io) 'src/outputs/file_output.dart'; +export 'src/log_printer.dart'; +export 'src/logger.dart'; export 'src/outputs/console_output.dart'; -export 'src/outputs/stream_output.dart'; export 'src/outputs/memory_output.dart'; export 'src/outputs/multi_output.dart'; - -export 'src/printers/pretty_printer.dart'; -export 'src/printers/logfmt_printer.dart'; -export 'src/printers/simple_printer.dart'; +export 'src/outputs/stream_output.dart'; export 'src/printers/hybrid_printer.dart'; +export 'src/printers/logfmt_printer.dart'; export 'src/printers/prefix_printer.dart'; - -export 'src/log_output.dart' - if (dart.library.io) 'src/outputs/file_output.dart'; - -export 'src/log_filter.dart'; -export 'src/log_output.dart'; -export 'src/log_printer.dart'; -export 'src/logger.dart'; +export 'src/printers/pretty_printer.dart'; +export 'src/printers/simple_printer.dart'; diff --git a/lib/src/ansi_color.dart b/lib/src/ansi_color.dart index a6e0f06..b4ea8f7 100644 --- a/lib/src/ansi_color.dart +++ b/lib/src/ansi_color.dart @@ -36,7 +36,7 @@ class AnsiColor { String call(String msg) { if (color) { - return '${this}$msg$ansiDefault'; + return '$this$msg$ansiDefault'; } else { return msg; } diff --git a/lib/src/filters/development_filter.dart b/lib/src/filters/development_filter.dart index a60f9b2..821c15f 100644 --- a/lib/src/filters/development_filter.dart +++ b/lib/src/filters/development_filter.dart @@ -1,5 +1,5 @@ -import 'package:logger/src/logger.dart'; import 'package:logger/src/log_filter.dart'; +import 'package:logger/src/logger.dart'; /// Prints all logs with `level >= Logger.level` while in development mode (eg /// when `assert`s are evaluated, Flutter calls this debug mode). diff --git a/lib/src/filters/production_filter.dart b/lib/src/filters/production_filter.dart index 891ece1..d6ceac0 100644 --- a/lib/src/filters/production_filter.dart +++ b/lib/src/filters/production_filter.dart @@ -1,5 +1,5 @@ -import 'package:logger/src/logger.dart'; import 'package:logger/src/log_filter.dart'; +import 'package:logger/src/logger.dart'; /// Prints all logs with `level >= Logger.level` even in production. class ProductionFilter extends LogFilter { diff --git a/lib/src/log_filter.dart b/lib/src/log_filter.dart index e512376..8fa2d03 100644 --- a/lib/src/log_filter.dart +++ b/lib/src/log_filter.dart @@ -6,6 +6,7 @@ import 'package:logger/src/logger.dart'; /// Every implementation should consider [Logger.level]. abstract class LogFilter { Level? level; + void init() {} /// Is called every time a new log message is sent and decides if diff --git a/lib/src/outputs/console_output.dart b/lib/src/outputs/console_output.dart index 277b604..8670db1 100644 --- a/lib/src/outputs/console_output.dart +++ b/lib/src/outputs/console_output.dart @@ -1,5 +1,5 @@ -import 'package:logger/src/logger.dart'; import 'package:logger/src/log_output.dart'; +import 'package:logger/src/logger.dart'; /// Default implementation of [LogOutput]. /// diff --git a/lib/src/outputs/file_output.dart b/lib/src/outputs/file_output.dart index c58c8e0..35b7b32 100644 --- a/lib/src/outputs/file_output.dart +++ b/lib/src/outputs/file_output.dart @@ -1,8 +1,8 @@ import 'dart:convert'; import 'dart:io'; -import 'package:logger/src/logger.dart'; import 'package:logger/src/log_output.dart'; +import 'package:logger/src/logger.dart'; /// Writes the log output to a file. class FileOutput extends LogOutput { diff --git a/lib/src/outputs/memory_output.dart b/lib/src/outputs/memory_output.dart index f0f4100..0a46f23 100644 --- a/lib/src/outputs/memory_output.dart +++ b/lib/src/outputs/memory_output.dart @@ -1,7 +1,7 @@ import 'dart:collection'; -import 'package:logger/src/logger.dart'; import 'package:logger/src/log_output.dart'; +import 'package:logger/src/logger.dart'; /// Buffers [OutputEvent]s. class MemoryOutput extends LogOutput { diff --git a/lib/src/outputs/multi_output.dart b/lib/src/outputs/multi_output.dart index bfa50d7..2e40ea2 100644 --- a/lib/src/outputs/multi_output.dart +++ b/lib/src/outputs/multi_output.dart @@ -8,6 +8,7 @@ class MultiOutput extends LogOutput { MultiOutput(List? outputs) { _outputs = _normalizeOutputs(outputs); } + List _normalizeOutputs(List? outputs) { final normalizedOutputs = []; @@ -24,16 +25,22 @@ class MultiOutput extends LogOutput { @override void init() { - _outputs.forEach((o) => o.init()); + for (var o in _outputs) { + o.init(); + } } @override void output(OutputEvent event) { - _outputs.forEach((o) => o.output(event)); + for (var o in _outputs) { + o.output(event); + } } @override void destroy() { - _outputs.forEach((o) => o.destroy()); + for (var o in _outputs) { + o.destroy(); + } } } diff --git a/lib/src/outputs/stream_output.dart b/lib/src/outputs/stream_output.dart index 8523b76..1a34329 100644 --- a/lib/src/outputs/stream_output.dart +++ b/lib/src/outputs/stream_output.dart @@ -1,7 +1,7 @@ import 'dart:async'; -import 'package:logger/src/logger.dart'; import 'package:logger/src/log_output.dart'; +import 'package:logger/src/logger.dart'; class StreamOutput extends LogOutput { late StreamController> _controller; diff --git a/lib/src/printers/hybrid_printer.dart b/lib/src/printers/hybrid_printer.dart index 83d4d64..9b3e655 100644 --- a/lib/src/printers/hybrid_printer.dart +++ b/lib/src/printers/hybrid_printer.dart @@ -1,5 +1,5 @@ -import 'package:logger/src/logger.dart'; import 'package:logger/src/log_printer.dart'; +import 'package:logger/src/logger.dart'; /// A decorator for a [LogPrinter] that allows for the composition of /// different printers to handle different log messages. Provide it's @@ -13,21 +13,26 @@ import 'package:logger/src/log_printer.dart'; /// Will use the pretty printer for all logs except Level.debug /// logs, which will use SimplePrinter(). class HybridPrinter extends LogPrinter { - final LogPrinter _realPrinter; - var _printerMap; + final Map _printerMap; - HybridPrinter(this._realPrinter, - {debug, verbose, wtf, info, warning, error}) { - _printerMap = { - Level.debug: debug ?? _realPrinter, - Level.verbose: verbose ?? _realPrinter, - Level.wtf: wtf ?? _realPrinter, - Level.info: info ?? _realPrinter, - Level.warning: warning ?? _realPrinter, - Level.error: error ?? _realPrinter, - }; - } + HybridPrinter( + LogPrinter realPrinter, { + LogPrinter? debug, + LogPrinter? verbose, + LogPrinter? wtf, + LogPrinter? info, + LogPrinter? warning, + LogPrinter? error, + }) : _printerMap = { + Level.debug: debug ?? realPrinter, + Level.verbose: verbose ?? realPrinter, + Level.wtf: wtf ?? realPrinter, + Level.info: info ?? realPrinter, + Level.warning: warning ?? realPrinter, + Level.error: error ?? realPrinter, + }; @override - List log(LogEvent event) => _printerMap[event.level].log(event); + List log(LogEvent event) => + _printerMap[event.level]?.log(event) ?? []; } diff --git a/lib/src/printers/prefix_printer.dart b/lib/src/printers/prefix_printer.dart index 256012e..6b89d92 100644 --- a/lib/src/printers/prefix_printer.dart +++ b/lib/src/printers/prefix_printer.dart @@ -1,5 +1,5 @@ -import 'package:logger/src/logger.dart'; import 'package:logger/src/log_printer.dart'; +import 'package:logger/src/logger.dart'; /// A decorator for a [LogPrinter] that allows for the prepending of every /// line in the log output with a string for the level of that log. For @@ -37,7 +37,7 @@ class PrefixPrinter extends LogPrinter { } int _longestPrefixLength() { - var compFunc = (String a, String b) => a.length > b.length ? a : b; + compFunc(String a, String b) => a.length > b.length ? a : b; return _prefixMap.values.reduce(compFunc).length; } } diff --git a/lib/src/printers/pretty_printer.dart b/lib/src/printers/pretty_printer.dart index f58f599..cf38856 100644 --- a/lib/src/printers/pretty_printer.dart +++ b/lib/src/printers/pretty_printer.dart @@ -1,8 +1,8 @@ import 'dart:convert'; -import 'package:logger/src/logger.dart'; -import 'package:logger/src/log_printer.dart'; import 'package:logger/src/ansi_color.dart'; +import 'package:logger/src/log_printer.dart'; +import 'package:logger/src/logger.dart'; /// Default implementation of [LogPrinter]. /// @@ -115,7 +115,9 @@ class PrettyPrinter extends LogPrinter { // Translate excludeBox map (constant if default) to includeBox map with all Level enum possibilities includeBox = {}; - Level.values.forEach((l) => includeBox[l] = !noBoxingByDefault); + for (var l in Level.values) { + includeBox[l] = !noBoxingByDefault; + } excludeBox.forEach((k, v) => includeBox[k] = !v); } @@ -202,22 +204,22 @@ class PrettyPrinter extends LogPrinter { } String getTime() { - String _threeDigits(int n) { + String threeDigits(int n) { if (n >= 100) return '$n'; if (n >= 10) return '0$n'; return '00$n'; } - String _twoDigits(int n) { + String twoDigits(int n) { if (n >= 10) return '$n'; return '0$n'; } var now = DateTime.now(); - var h = _twoDigits(now.hour); - var min = _twoDigits(now.minute); - var sec = _twoDigits(now.second); - var ms = _threeDigits(now.millisecond); + var h = twoDigits(now.hour); + var min = twoDigits(now.minute); + var sec = twoDigits(now.second); + var ms = threeDigits(now.millisecond); var timeSinceStart = now.difference(_startTime!).toString(); return '$h:$min:$sec.$ms (+$timeSinceStart)'; } @@ -275,7 +277,7 @@ class PrettyPrinter extends LogPrinter { // This code is non trivial and a type annotation here helps understanding. // ignore: omit_local_variable_types List buffer = []; - var verticalLineAtLevel = (includeBox[level]!) ? (verticalLine + ' ') : ''; + var verticalLineAtLevel = (includeBox[level]!) ? ('$verticalLine ') : ''; var color = _getLevelColor(level); if (includeBox[level]!) buffer.add(color(_topBorder)); diff --git a/lib/src/printers/simple_printer.dart b/lib/src/printers/simple_printer.dart index d7a4adf..f10d0cd 100644 --- a/lib/src/printers/simple_printer.dart +++ b/lib/src/printers/simple_printer.dart @@ -1,8 +1,8 @@ import 'dart:convert'; -import 'package:logger/src/logger.dart'; -import 'package:logger/src/log_printer.dart'; import 'package:logger/src/ansi_color.dart'; +import 'package:logger/src/log_printer.dart'; +import 'package:logger/src/logger.dart'; /// Outputs simple log messages: /// ``` diff --git a/pubspec.yaml b/pubspec.yaml index 0b84b90..2f5844b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,4 +8,4 @@ environment: dev_dependencies: test: ^1.16.8 - pedantic: ^1.11.0 + lints: ^2.0.1 diff --git a/test/printers/prefix_printer_test.dart b/test/printers/prefix_printer_test.dart index 7ca0a43..509cf80 100644 --- a/test/printers/prefix_printer_test.dart +++ b/test/printers/prefix_printer_test.dart @@ -25,22 +25,22 @@ void main() { test('prefixes logs', () { var printer = PrefixPrinter(PrettyPrinter()); var actualLog = printer.log(infoEvent); - actualLog.forEach((logString) { + for (var logString in actualLog) { expect(logString, contains('INFO')); - }); + } var debugLog = printer.log(debugEvent); - debugLog.forEach((logString) { + for (var logString in debugLog) { expect(logString, contains('DEBUG')); - }); + } }); test('can supply own prefixes', () { var printer = PrefixPrinter(PrettyPrinter(), debug: 'BLAH'); var actualLog = printer.log(debugEvent); - actualLog.forEach((logString) { + for (var logString in actualLog) { expect(logString, contains('BLAH')); - }); + } }); test('pads to same length', () { @@ -49,9 +49,9 @@ void main() { var printer = PrefixPrinter(SimplePrinter(), debug: longPrefix); for (var event in allEvents) { var l1 = printer.log(event); - l1.forEach((logString) { + for (var logString in l1) { expect(logString.substring(0, len), isNot(contains('['))); - }); + } } }); } diff --git a/test/printers/pretty_printer_test.dart b/test/printers/pretty_printer_test.dart index 52727a2..edcc113 100644 --- a/test/printers/pretty_printer_test.dart +++ b/test/printers/pretty_printer_test.dart @@ -2,7 +2,7 @@ import 'package:logger/logger.dart'; import 'package:test/test.dart'; void main() { - String _readMessage(List log) { + String readMessage(List log) { return log.reduce((acc, val) => acc + val); } @@ -19,7 +19,7 @@ void main() { ); final actualLog = emojiPrettyPrinter.log(event); - final actualLogString = _readMessage(actualLog); + final actualLogString = readMessage(actualLog); expect(actualLogString, contains(PrettyPrinter.levelEmojis[Level.debug])); expect(actualLogString, contains(expectedMessage)); }); @@ -34,7 +34,7 @@ void main() { ); final actualLog = prettyPrinter.log(withFunction); - final actualLogString = _readMessage(actualLog); + final actualLogString = readMessage(actualLog); expect( actualLogString, @@ -51,7 +51,7 @@ void main() { ); final actualLog = prettyPrinter.log(withMap); - final actualLogString = _readMessage(actualLog); + final actualLogString = readMessage(actualLog); for (var expectedMsg in expectedMsgMap.entries) { expect( actualLogString, @@ -69,7 +69,7 @@ void main() { StackTrace.current, ); final actualLog = prettyPrinter.log(withIterable); - final actualLogString = _readMessage(actualLog); + final actualLogString = readMessage(actualLog); for (var expectedMsg in expectedMsgItems) { expect( actualLogString, @@ -88,7 +88,7 @@ void main() { ); final actualLog = prettyPrinter.log(withFunction); - final actualLogString = _readMessage(actualLog); + final actualLogString = readMessage(actualLog); expect( actualLogString, From 77cdd828a83491bbfb39836d310f3bd3b507f02f Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Wed, 8 Feb 2023 17:16:33 +0100 Subject: [PATCH 04/30] Fixed doc reference --- lib/src/log_printer.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/log_printer.dart b/lib/src/log_printer.dart index d0cb53a..a40125c 100644 --- a/lib/src/log_printer.dart +++ b/lib/src/log_printer.dart @@ -3,7 +3,7 @@ import 'package:logger/src/logger.dart'; /// An abstract handler of log events. /// /// A log printer creates and formats the output, which is then sent to -/// [LogOutput]. Every implementation has to use the [LogPrinter.println] +/// [LogOutput]. Every implementation has to use the [LogPrinter.log] /// method to send the output. /// /// You can implement a `LogPrinter` from scratch or extend [PrettyPrinter]. From a6970d9e847b875b4d0f2f154745e89484418190 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Wed, 8 Feb 2023 17:58:42 +0100 Subject: [PATCH 05/30] Added origin LogEvent to OutputEvent, addresses https://github.com/simc/logger/pull/133 --- lib/src/logger.dart | 10 ++++++---- test/outputs/memory_output_test.dart | 6 +++--- test/outputs/multi_output_test.dart | 8 ++++---- test/outputs/stream_output_test.dart | 12 ++++++------ 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/lib/src/logger.dart b/lib/src/logger.dart index dcd8eac..0d2b56e 100644 --- a/lib/src/logger.dart +++ b/lib/src/logger.dart @@ -23,14 +23,16 @@ class LogEvent { final dynamic error; final StackTrace? stackTrace; - LogEvent(this.level, this.message, this.error, this.stackTrace); + LogEvent(this.level, this.message, [this.error, this.stackTrace]); } class OutputEvent { - final Level level; final List lines; + final LogEvent origin; + + Level get level => origin.level; - OutputEvent(this.level, this.lines); + OutputEvent(this.origin, this.lines); } typedef LogCallback = void Function(LogEvent event); @@ -120,7 +122,7 @@ class Logger { var output = _printer.log(logEvent); if (output.isNotEmpty) { - var outputEvent = OutputEvent(level, output); + var outputEvent = OutputEvent(logEvent, output); // Issues with log output should NOT influence // the main software behavior. try { diff --git a/test/outputs/memory_output_test.dart b/test/outputs/memory_output_test.dart index 4d92b2a..10874f4 100644 --- a/test/outputs/memory_output_test.dart +++ b/test/outputs/memory_output_test.dart @@ -5,9 +5,9 @@ void main() { test('Memory output buffer size is limited', () { var output = MemoryOutput(bufferSize: 2); - final event0 = OutputEvent(Level.info, []); - final event1 = OutputEvent(Level.info, []); - final event2 = OutputEvent(Level.info, []); + final event0 = OutputEvent(LogEvent(Level.info, null), []); + final event1 = OutputEvent(LogEvent(Level.info, null), []); + final event2 = OutputEvent(LogEvent(Level.info, null), []); output.output(event0); output.output(event1); diff --git a/test/outputs/multi_output_test.dart b/test/outputs/multi_output_test.dart index ab7be20..0d83f56 100644 --- a/test/outputs/multi_output_test.dart +++ b/test/outputs/multi_output_test.dart @@ -8,7 +8,7 @@ void main() { final multiOutput = MultiOutput([output1, output2]); - final event0 = OutputEvent(Level.info, []); + final event0 = OutputEvent(LogEvent(Level.info, null), []); multiOutput.output(event0); expect(output1.buffer.length, 1); @@ -16,7 +16,7 @@ void main() { expect(output1.buffer.elementAt(0), equals(output2.buffer.elementAt(0))); expect(output1.buffer.elementAt(0), equals(event0)); - final event1 = OutputEvent(Level.info, []); + final event1 = OutputEvent(LogEvent(Level.info, null), []); multiOutput.output(event1); expect(output1.buffer.length, 2); @@ -29,11 +29,11 @@ void main() { test('passing null does not throw an exception', () { final output = MultiOutput(null); - output.output(OutputEvent(Level.info, [])); + output.output(OutputEvent(LogEvent(Level.info, null), [])); }); test('passing null in the list does not throw an exception', () { final output = MultiOutput([null]); - output.output(OutputEvent(Level.info, [])); + output.output(OutputEvent(LogEvent(Level.info, null), [])); }); } diff --git a/test/outputs/stream_output_test.dart b/test/outputs/stream_output_test.dart index 506abad..7a9ba49 100644 --- a/test/outputs/stream_output_test.dart +++ b/test/outputs/stream_output_test.dart @@ -1,5 +1,5 @@ -import 'package:test/test.dart'; import 'package:logger/logger.dart'; +import 'package:test/test.dart'; void main() { test('writes to a Stream', () { @@ -9,19 +9,19 @@ void main() { expect(e, ['hi there']); }); - out.output(OutputEvent(Level.debug, ['hi there'])); + out.output(OutputEvent(LogEvent(Level.debug, null), ['hi there'])); }); test('respects listen', () { var out = StreamOutput(); - out.output(OutputEvent(Level.debug, ['dropped'])); + out.output(OutputEvent(LogEvent(Level.debug, null), ['dropped'])); out.stream.listen((var e) { expect(e, ['hi there']); }); - out.output(OutputEvent(Level.debug, ['hi there'])); + out.output(OutputEvent(LogEvent(Level.debug, null), ['hi there'])); }); test('respects pause', () { @@ -32,8 +32,8 @@ void main() { }); sub.pause(); - out.output(OutputEvent(Level.debug, ['dropped'])); + out.output(OutputEvent(LogEvent(Level.debug, null), ['dropped'])); sub.resume(); - out.output(OutputEvent(Level.debug, ['hi there'])); + out.output(OutputEvent(LogEvent(Level.debug, null), ['hi there'])); }); } From 68767d80cda1bf47ee03f15944083164fb4417ef Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Wed, 8 Feb 2023 22:09:00 +0100 Subject: [PATCH 06/30] Updated dart.yml --- .github/workflows/dart.yml | 48 +++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index eabf7a8..76e91ee 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -1,26 +1,42 @@ -name: Dart CI +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Dart on: push: - branches: [ master ] + branches: [ "master" ] pull_request: - branches: [ master ] + branches: [ "master" ] jobs: build: - runs-on: ubuntu-latest - container: - image: google/dart:2.12 - steps: - - uses: actions/checkout@v2 - - name: Install dependencies - run: pub get - - name: Format code - run: dartfmt -n --set-exit-if-changed . - - name: Static analyze project - run: dartanalyzer --fatal-infos --fatal-warnings . - - name: Run tests - run: pub run test + - uses: actions/checkout@v3 + + # Note: This workflow uses the latest stable version of the Dart SDK. + # You can specify other versions if desired, see documentation here: + # https://github.com/dart-lang/setup-dart/blob/main/README.md + # - uses: dart-lang/setup-dart@v1 + - uses: dart-lang/setup-dart@9a04e6d73cca37bd455e0608d7e5092f881fd603 + + - name: Install dependencies + run: dart pub get + + # Uncomment this step to verify the use of 'dart format' on each commit. + - name: Verify formatting + run: dart format --output=none --set-exit-if-changed . + + # Consider passing '--fatal-infos' for slightly stricter analysis. + - name: Analyze project source + run: dart analyze --fatal-infos + + # Your project will need to have tests in test/ and a dependency on + # package:test for this step to succeed. Note that Flutter projects will + # want to change this to 'flutter test'. + - name: Run tests + run: dart test From 45761a6d4cc9342b1672768a1337012e84ec8c7a Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Wed, 8 Feb 2023 22:21:43 +0100 Subject: [PATCH 07/30] Fixed CI shield --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8dde5e0..b9245d1 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Logger [![pub package](https://img.shields.io/pub/v/logger.svg?logo=dart&logoColor=00b9fc)](https://pub.dartlang.org/packages/logger) -[![CI](https://img.shields.io/github/workflow/status/Bungeefan/logger/Dart%20CI/master?logo=github-actions&logoColor=white)](https://github.com/Bungeefan/logger/actions) +[![CI](https://img.shields.io/github/actions/workflow/status/Bungeefan/logger/dart.yml?branch=master&logo=github-actions&logoColor=white)](https://github.com/Bungeefan/logger/actions) [![Last Commits](https://img.shields.io/github/last-commit/Bungeefan/logger?logo=git&logoColor=white)](https://github.com/Bungeefan/logger/commits/master) [![Pull Requests](https://img.shields.io/github/issues-pr/Bungeefan/logger?logo=github&logoColor=white)](https://github.com/Bungeefan/logger/pulls) [![Code size](https://img.shields.io/github/languages/code-size/Bungeefan/logger?logo=github&logoColor=white)](https://github.com/Bungeefan/logger) From a276e6fddf4f22715dde7b8f87403991d5f2cd13 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Wed, 15 Feb 2023 21:18:06 +0100 Subject: [PATCH 08/30] Removed obsolete .travis.yml --- .travis.yml | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index b2c590a..0000000 --- a/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: dart -dart: - - stable - -dart_task: - - dartfmt - - dartanalyzer: --fatal-warnings . - - test From 0e58c14860c836d533118cf1d25a0693be7bebd2 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Wed, 22 Feb 2023 23:07:01 +0100 Subject: [PATCH 09/30] Bumped version to 1.2.0 --- CHANGELOG.md | 12 ++++++++++-- pubspec.yaml | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e6c33c..95577a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,17 @@ +## 1.2.0 + +- Added origin LogEvent to OutputEvent. Addresses [#133](https://github.com/simc/logger/pull/133). +- Re-added LogListener and OutputListener (Should restore compatibility with logger_flutter). +- Replaced pedantic with lints. + ## 1.1.0 + - Enhance boxing control with PrettyPrinter. Credits to @timmaffett - Add trailing new line to FileOutput. Credits to @narumishi - Add functions as a log message. Credits to @smotastic ## 1.0.0 + - Stable nullsafety ## 1.0.0-nullsafety.0 @@ -22,7 +30,7 @@ ## 0.9.2 - Add `PrefixPrinter`. Credits to @tkutcher. - Add `HybridPrinter`. Credits to @tkutcher. - + ## 0.9.1 - Fix logging output for Flutter Web. Credits to @nateshmbhat and @Cocotus. @@ -45,7 +53,7 @@ - Fix SimplePrinter showTime #12 - Remove buffer field - Update library structure (thanks @marcgraub!) - + ## 0.7.0+1 - Added `ProductionFilter`, `FileOutput`, `MemoryOutput`, `SimplePrinter` - Breaking: Changed `LogFilter`, `LogPrinter` and `LogOutput` diff --git a/pubspec.yaml b/pubspec.yaml index 2f5844b..8e20d62 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: logger description: Small, easy to use and extensible logger which prints beautiful logs. -version: 1.1.0 +version: 1.2.0 repository: https://github.com/Bungeefan/logger environment: From bf4e655ac2d1fa8ce7c6024e9aeb1304d9fec9a7 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Thu, 23 Feb 2023 03:11:58 +0100 Subject: [PATCH 10/30] Reverted `${this}` interpolation and added linter ignore, fixes #1 --- lib/src/ansi_color.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/ansi_color.dart b/lib/src/ansi_color.dart index b4ea8f7..22ea7f5 100644 --- a/lib/src/ansi_color.dart +++ b/lib/src/ansi_color.dart @@ -36,7 +36,8 @@ class AnsiColor { String call(String msg) { if (color) { - return '$this$msg$ansiDefault'; + // ignore: unnecessary_brace_in_string_interps + return '${this}$msg$ansiDefault'; } else { return msg; } From 2f940c567c37727706ad64c851abc0f6cba933c1 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Thu, 23 Feb 2023 03:13:04 +0100 Subject: [PATCH 11/30] Bumped version to 1.2.1 --- CHANGELOG.md | 5 +++++ pubspec.yaml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95577a8..a57df04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.2.1 + +- Reverted `${this}` interpolation and added linter + ignore. [#1](https://github.com/Bungeefan/logger/issues/1) + ## 1.2.0 - Added origin LogEvent to OutputEvent. Addresses [#133](https://github.com/simc/logger/pull/133). diff --git a/pubspec.yaml b/pubspec.yaml index 8e20d62..23fb53c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: logger description: Small, easy to use and extensible logger which prints beautiful logs. -version: 1.2.0 +version: 1.2.1 repository: https://github.com/Bungeefan/logger environment: From 76274726af89ba6311b4471baae47f77e6c6f843 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Thu, 23 Feb 2023 03:45:05 +0100 Subject: [PATCH 12/30] Added CI run for Dart SDK 2.17.0 --- .github/workflows/dart.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 76e91ee..ef4d72e 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -3,6 +3,9 @@ # separate terms of service, privacy policy, and support # documentation. +# See documentation here: +# https://github.com/dart-lang/setup-dart/blob/main/README.md + name: Dart on: @@ -14,15 +17,15 @@ on: jobs: build: runs-on: ubuntu-latest - + strategy: + matrix: + sdk: [ stable, 2.17.0 ] steps: - uses: actions/checkout@v3 - # Note: This workflow uses the latest stable version of the Dart SDK. - # You can specify other versions if desired, see documentation here: - # https://github.com/dart-lang/setup-dart/blob/main/README.md - # - uses: dart-lang/setup-dart@v1 - - uses: dart-lang/setup-dart@9a04e6d73cca37bd455e0608d7e5092f881fd603 + - uses: dart-lang/setup-dart@v1 + with: + sdk: ${{ matrix.sdk }} - name: Install dependencies run: dart pub get From 966300090c5add0cd12562fbfaed1367621468a9 Mon Sep 17 00:00:00 2001 From: Christophe Oosterlynck Date: Thu, 23 Feb 2023 10:08:03 +0100 Subject: [PATCH 13/30] Expose LogOutput class unconditionally --- lib/logger.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/logger.dart b/lib/logger.dart index 10337f3..912aa92 100644 --- a/lib/logger.dart +++ b/lib/logger.dart @@ -5,6 +5,8 @@ export 'src/ansi_color.dart'; export 'src/filters/development_filter.dart'; export 'src/filters/production_filter.dart'; export 'src/log_filter.dart'; +// [LogOutput] class needs to be exposed unconditionally +export 'src/log_output.dart'; export 'src/log_output.dart' if (dart.library.io) 'src/outputs/file_output.dart'; export 'src/log_printer.dart'; From 17675e3e97faddc03776ff5f9a572ced79cbe96a Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Thu, 23 Feb 2023 10:22:25 +0100 Subject: [PATCH 14/30] Fixed linter warning, closes #3 --- lib/logger.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/logger.dart b/lib/logger.dart index 912aa92..cfca1b4 100644 --- a/lib/logger.dart +++ b/lib/logger.dart @@ -7,6 +7,7 @@ export 'src/filters/production_filter.dart'; export 'src/log_filter.dart'; // [LogOutput] class needs to be exposed unconditionally export 'src/log_output.dart'; +// ignore: duplicate_export export 'src/log_output.dart' if (dart.library.io) 'src/outputs/file_output.dart'; export 'src/log_printer.dart'; From 9e9dbdb33c7f9cc50e9da5bc1c616719709c7462 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Thu, 23 Feb 2023 10:27:57 +0100 Subject: [PATCH 15/30] Bumped version to 1.2.2 --- CHANGELOG.md | 5 +++++ pubspec.yaml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a57df04..b1d9a71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.2.2 + +- Fixed conditional LogOutput export. Credits to + @ChristopheOosterlynck [#4](https://github.com/Bungeefan/logger/pull/4). + ## 1.2.1 - Reverted `${this}` interpolation and added linter diff --git a/pubspec.yaml b/pubspec.yaml index 23fb53c..3b47a1b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: logger description: Small, easy to use and extensible logger which prints beautiful logs. -version: 1.2.1 +version: 1.2.2 repository: https://github.com/Bungeefan/logger environment: From 57f4ec7e82cbf33784e5c15e7fa16e3a2f76bcc4 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Thu, 23 Feb 2023 10:37:46 +0100 Subject: [PATCH 16/30] Added `continue-on-error` to run CI for all specified SDK versions --- .github/workflows/dart.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index ef4d72e..1e87760 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -17,6 +17,7 @@ on: jobs: build: runs-on: ubuntu-latest + continue-on-error: true strategy: matrix: sdk: [ stable, 2.17.0 ] From 0cc96e24f2780229192e321e263ad05c04a53d4a Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Sat, 25 Feb 2023 17:21:27 +0100 Subject: [PATCH 17/30] Added `error` handling to LogfmtPrinter --- lib/src/printers/logfmt_printer.dart | 3 +++ test/printers/logfmt_printer_test.dart | 34 +++++++++++++++++++------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/lib/src/printers/logfmt_printer.dart b/lib/src/printers/logfmt_printer.dart index 63083e5..85c5024 100644 --- a/lib/src/printers/logfmt_printer.dart +++ b/lib/src/printers/logfmt_printer.dart @@ -29,6 +29,9 @@ class LogfmtPrinter extends LogPrinter { } }); } + if (event.error != null) { + output.write(' error="${event.error}"'); + } return [output.toString()]; } diff --git a/test/printers/logfmt_printer_test.dart b/test/printers/logfmt_printer_test.dart index 4a98cec..ad3d4b9 100644 --- a/test/printers/logfmt_printer_test.dart +++ b/test/printers/logfmt_printer_test.dart @@ -1,5 +1,5 @@ -import 'package:test/test.dart'; import 'package:logger/logger.dart'; +import 'package:test/test.dart'; void main() { var printer = LogfmtPrinter(); @@ -18,13 +18,14 @@ void main() { test('with a string message includes a msg key', () { expect( - printer.log(LogEvent( - Level.debug, - 'some message', - Exception('boom'), - StackTrace.current, - ))[0], - contains('msg="some message"')); + printer.log(LogEvent( + Level.debug, + 'some message', + Exception('boom'), + StackTrace.current, + ))[0], + contains('msg="some message"'), + ); }); test('includes random key=value pairs', () { @@ -39,6 +40,21 @@ void main() { expect(output, contains('foo="bar baz"')); }); + test('handles an error/exception', () { + var output = printer.log(LogEvent( + Level.debug, + 'some message', + Exception('boom'), + StackTrace.current, + ))[0]; + expect(output, contains('error="Exception: boom"')); + + output = printer.log(LogEvent( + Level.debug, + 'some message', + ))[0]; + expect(output, isNot(contains('error='))); + }); + test('handles a stacktrace', () {}, skip: 'TODO'); - test('handles an error/exception', () {}, skip: 'TODO'); } From 9a8da9c0458bc7e19e39d5cc6419116ab356b1e1 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Sat, 25 Feb 2023 18:49:48 +0100 Subject: [PATCH 18/30] Fixed test imports (removed /src imports) --- test/logger_test.dart | 2 +- test/printers/hybrid_printer_test.dart | 7 ++----- test/printers/prefix_printer_test.dart | 5 +---- test/printers/simple_printer_test.dart | 3 +-- 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/test/logger_test.dart b/test/logger_test.dart index 1025c25..4387b23 100644 --- a/test/logger_test.dart +++ b/test/logger_test.dart @@ -1,7 +1,7 @@ import 'dart:math'; -import 'package:test/test.dart'; import 'package:logger/logger.dart'; +import 'package:test/test.dart'; typedef PrinterCallback = List Function( Level level, diff --git a/test/printers/hybrid_printer_test.dart b/test/printers/hybrid_printer_test.dart index ce6e880..53ef327 100644 --- a/test/printers/hybrid_printer_test.dart +++ b/test/printers/hybrid_printer_test.dart @@ -1,14 +1,11 @@ -import 'package:logger/src/log_printer.dart'; -import 'package:logger/src/logger.dart'; -import 'package:logger/src/printers/simple_printer.dart'; +import 'package:logger/logger.dart'; import 'package:test/test.dart'; -import 'package:logger/src/printers/hybrid_printer.dart'; - final realPrinter = SimplePrinter(); class TestLogPrinter extends LogPrinter { LogEvent? latestEvent; + @override List log(LogEvent event) { latestEvent = event; diff --git a/test/printers/prefix_printer_test.dart b/test/printers/prefix_printer_test.dart index 509cf80..a3011e4 100644 --- a/test/printers/prefix_printer_test.dart +++ b/test/printers/prefix_printer_test.dart @@ -1,7 +1,4 @@ -import 'package:logger/src/logger.dart'; -import 'package:logger/src/printers/prefix_printer.dart'; -import 'package:logger/src/printers/pretty_printer.dart'; -import 'package:logger/src/printers/simple_printer.dart'; +import 'package:logger/logger.dart'; import 'package:test/test.dart'; void main() { diff --git a/test/printers/simple_printer_test.dart b/test/printers/simple_printer_test.dart index ad3f904..c185d50 100644 --- a/test/printers/simple_printer_test.dart +++ b/test/printers/simple_printer_test.dart @@ -1,5 +1,4 @@ -import 'package:logger/src/logger.dart'; -import 'package:logger/src/printers/simple_printer.dart'; +import 'package:logger/logger.dart'; import 'package:test/test.dart'; const ansiEscapeLiteral = '\x1B'; From f7f4779f77ed698de455cadcd008cf9f85d40b6a Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Sat, 25 Feb 2023 19:46:40 +0100 Subject: [PATCH 19/30] Fixed stackTrace count when using `stackTraceBeginIndex`, addresses https://github.com/simc/logger/issues/114 --- lib/src/printers/pretty_printer.dart | 31 ++++++++++++++------------ test/printers/pretty_printer_test.dart | 26 ++++++++++++++++++++- 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/lib/src/printers/pretty_printer.dart b/lib/src/printers/pretty_printer.dart index cf38856..898b38f 100644 --- a/lib/src/printers/pretty_printer.dart +++ b/lib/src/printers/pretty_printer.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:math'; import 'package:logger/src/ansi_color.dart'; import 'package:logger/src/log_printer.dart'; @@ -151,23 +152,25 @@ class PrettyPrinter extends LogPrinter { } String? formatStackTrace(StackTrace? stackTrace, int methodCount) { - var lines = stackTrace.toString().split('\n'); - if (stackTraceBeginIndex > 0 && stackTraceBeginIndex < lines.length - 1) { - lines = lines.sublist(stackTraceBeginIndex); - } - var formatted = []; - var count = 0; - for (var line in lines) { - if (_discardDeviceStacktraceLine(line) || - _discardWebStacktraceLine(line) || - _discardBrowserStacktraceLine(line) || - line.isEmpty) { + List lines = stackTrace + .toString() + .split('\n') + .where( + (line) => + !_discardDeviceStacktraceLine(line) && + !_discardWebStacktraceLine(line) && + !_discardBrowserStacktraceLine(line) && + line.isNotEmpty, + ) + .toList(); + List formatted = []; + + for (int count = 0; count < min(lines.length, methodCount); count++) { + var line = lines[count]; + if (count < stackTraceBeginIndex) { continue; } formatted.add('#$count ${line.replaceFirst(RegExp(r'#\d+\s+'), '')}'); - if (++count == methodCount) { - break; - } } if (formatted.isEmpty) { diff --git a/test/printers/pretty_printer_test.dart b/test/printers/pretty_printer_test.dart index edcc113..0f852c8 100644 --- a/test/printers/pretty_printer_test.dart +++ b/test/printers/pretty_printer_test.dart @@ -3,7 +3,7 @@ import 'package:test/test.dart'; void main() { String readMessage(List log) { - return log.reduce((acc, val) => acc + val); + return log.reduce((acc, val) => "$acc\n$val"); } final prettyPrinter = PrettyPrinter(printEmojis: false); @@ -95,4 +95,28 @@ void main() { contains(expectedMessage), ); }); + + test('stackTraceBeginIndex', () { + final prettyPrinter = PrettyPrinter( + stackTraceBeginIndex: 2, + ); + final withFunction = LogEvent( + Level.debug, + "some message", + 'some error', + StackTrace.current, + ); + + final actualLog = prettyPrinter.log(withFunction); + final actualLogString = readMessage(actualLog); + + expect( + actualLogString, + allOf([ + isNot(contains("#0 ")), + isNot(contains("#1 ")), + contains("#2 "), + ]), + ); + }); } From 1d8d47dc06b1a55dc92c92b5bf90ed6409392b4e Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Sat, 25 Feb 2023 23:54:10 +0100 Subject: [PATCH 20/30] Added `time` to LogEvent --- lib/src/logger.dart | 6 +++++- lib/src/printers/pretty_printer.dart | 6 +++--- lib/src/printers/simple_printer.dart | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/src/logger.dart b/lib/src/logger.dart index 0d2b56e..f9fc9fd 100644 --- a/lib/src/logger.dart +++ b/lib/src/logger.dart @@ -23,7 +23,11 @@ class LogEvent { final dynamic error; final StackTrace? stackTrace; - LogEvent(this.level, this.message, [this.error, this.stackTrace]); + /// Time when this log was created. + final DateTime time; + + LogEvent(this.level, this.message, [this.error, this.stackTrace]) + : time = DateTime.now(); } class OutputEvent { diff --git a/lib/src/printers/pretty_printer.dart b/lib/src/printers/pretty_printer.dart index 898b38f..99e1380 100644 --- a/lib/src/printers/pretty_printer.dart +++ b/lib/src/printers/pretty_printer.dart @@ -139,7 +139,7 @@ class PrettyPrinter extends LogPrinter { String? timeStr; if (printTime) { - timeStr = getTime(); + timeStr = getTime(event.time); } return _formatAndPrint( @@ -206,7 +206,7 @@ class PrettyPrinter extends LogPrinter { match.group(1)!.startsWith('dart:'); } - String getTime() { + String getTime(DateTime time) { String threeDigits(int n) { if (n >= 100) return '$n'; if (n >= 10) return '0$n'; @@ -218,7 +218,7 @@ class PrettyPrinter extends LogPrinter { return '0$n'; } - var now = DateTime.now(); + var now = time; var h = twoDigits(now.hour); var min = twoDigits(now.minute); var sec = twoDigits(now.second); diff --git a/lib/src/printers/simple_printer.dart b/lib/src/printers/simple_printer.dart index f10d0cd..7041036 100644 --- a/lib/src/printers/simple_printer.dart +++ b/lib/src/printers/simple_printer.dart @@ -36,7 +36,7 @@ class SimplePrinter extends LogPrinter { List log(LogEvent event) { var messageStr = _stringifyMessage(event.message); var errorStr = event.error != null ? ' ERROR: ${event.error}' : ''; - var timeStr = printTime ? 'TIME: ${DateTime.now().toIso8601String()}' : ''; + var timeStr = printTime ? 'TIME: ${event.time.toIso8601String()}' : ''; return ['${_labelFor(event.level)} $timeStr $messageStr$errorStr']; } From 6f35b504b87972685c262ff7d2627d2f7a7f1bd7 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Sat, 25 Feb 2023 23:58:12 +0100 Subject: [PATCH 21/30] Added `isClosed`, addresses https://github.com/simc/logger/issues/130 --- lib/src/logger.dart | 4 ++++ test/logger_test.dart | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/lib/src/logger.dart b/lib/src/logger.dart index f9fc9fd..5fc69ca 100644 --- a/lib/src/logger.dart +++ b/lib/src/logger.dart @@ -142,6 +142,10 @@ class Logger { } } + bool isClosed() { + return !_active; + } + /// Closes the logger and releases all resources. void close() { _active = false; diff --git a/test/logger_test.dart b/test/logger_test.dart index 4387b23..40db942 100644 --- a/test/logger_test.dart +++ b/test/logger_test.dart @@ -168,4 +168,11 @@ void main() { logger.w('This is'); expect(printedMessage, 'This is'); }); + + test('Logger.close', () { + var logger = Logger(); + expect(logger.isClosed(), false); + logger.close(); + expect(logger.isClosed(), true); + }); } From 985e86274d37b8b28c356025ffa5c93008837c61 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Sun, 26 Feb 2023 00:09:19 +0100 Subject: [PATCH 22/30] Removed obsolete linter ignore --- lib/src/printers/pretty_printer.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/src/printers/pretty_printer.dart b/lib/src/printers/pretty_printer.dart index 99e1380..12a3a92 100644 --- a/lib/src/printers/pretty_printer.dart +++ b/lib/src/printers/pretty_printer.dart @@ -277,8 +277,6 @@ class PrettyPrinter extends LogPrinter { String? error, String? stacktrace, ) { - // This code is non trivial and a type annotation here helps understanding. - // ignore: omit_local_variable_types List buffer = []; var verticalLineAtLevel = (includeBox[level]!) ? ('$verticalLine ') : ''; var color = _getLevelColor(level); From ea8c9c4b95c87a1751c3ca178895723aeef963aa Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Sun, 26 Feb 2023 16:18:31 +0100 Subject: [PATCH 23/30] Replaced `continue-on-error` with `fail-fast`, continues 57f4ec7e82cbf33784e5c15e7fa16e3a2f76bcc4. This should enable all jobs to run without being cancelled, while also ensuring that the workflow fails in the event of an error. --- .github/workflows/dart.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 1e87760..1c6dd4c 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -17,8 +17,8 @@ on: jobs: build: runs-on: ubuntu-latest - continue-on-error: true strategy: + fail-fast: false matrix: sdk: [ stable, 2.17.0 ] steps: From 8e3fbea54cd200374fdfdacd7d4053dcdbf5743c Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Mon, 27 Feb 2023 22:10:42 +0100 Subject: [PATCH 24/30] Added proper FileOutput stub, addresses https://github.com/simc/logger/issues/94 --- lib/logger.dart | 6 ++---- lib/src/outputs/file_output_stub.dart | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 lib/src/outputs/file_output_stub.dart diff --git a/lib/logger.dart b/lib/logger.dart index cfca1b4..b3fba84 100644 --- a/lib/logger.dart +++ b/lib/logger.dart @@ -5,14 +5,12 @@ export 'src/ansi_color.dart'; export 'src/filters/development_filter.dart'; export 'src/filters/production_filter.dart'; export 'src/log_filter.dart'; -// [LogOutput] class needs to be exposed unconditionally export 'src/log_output.dart'; -// ignore: duplicate_export -export 'src/log_output.dart' - if (dart.library.io) 'src/outputs/file_output.dart'; export 'src/log_printer.dart'; export 'src/logger.dart'; export 'src/outputs/console_output.dart'; +export 'src/outputs/file_output_stub.dart' + if (dart.library.io) 'src/outputs/file_output.dart'; export 'src/outputs/memory_output.dart'; export 'src/outputs/multi_output.dart'; export 'src/outputs/stream_output.dart'; diff --git a/lib/src/outputs/file_output_stub.dart b/lib/src/outputs/file_output_stub.dart new file mode 100644 index 0000000..b4eb4db --- /dev/null +++ b/lib/src/outputs/file_output_stub.dart @@ -0,0 +1,20 @@ +import 'dart:convert'; +import 'dart:io'; + +import '../log_output.dart'; +import '../logger.dart'; + +class FileOutput extends LogOutput { + FileOutput({ + required File file, + bool overrideExisting = false, + Encoding encoding = utf8, + }) { + throw UnsupportedError("Not supported on this platform."); + } + + @override + void output(OutputEvent event) { + throw UnsupportedError("Not supported on this platform."); + } +} From d437a0c077e415041d668991585b0057efd0ff68 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Sun, 12 Mar 2023 16:12:47 +0100 Subject: [PATCH 25/30] Bumped version to 1.3.0 --- CHANGELOG.md | 9 +++++++++ pubspec.yaml | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1d9a71..1e8deb5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## 1.3.0 + +- Fixed stackTrace count when using `stackTraceBeginIndex`. + Addresses [#114](https://github.com/simc/logger/issues/114). +- Added proper FileOutput stub. Addresses [#94](https://github.com/simc/logger/issues/94). +- Added `isClosed`. Addresses [#130](https://github.com/simc/logger/issues/130). +- Added `time` to LogEvent. +- Added `error` handling to LogfmtPrinter. + ## 1.2.2 - Fixed conditional LogOutput export. Credits to diff --git a/pubspec.yaml b/pubspec.yaml index 3b47a1b..fcde43d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: logger description: Small, easy to use and extensible logger which prints beautiful logs. -version: 1.2.2 +version: 1.3.0 repository: https://github.com/Bungeefan/logger environment: From 2a047d4cd6fd25679ca0471dd49256f26b0a9743 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Wed, 10 May 2023 22:44:16 +0200 Subject: [PATCH 26/30] Simplified sdk constraint --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index fcde43d..a441cbb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ version: 1.3.0 repository: https://github.com/Bungeefan/logger environment: - sdk: ">=2.12.0 <3.0.0" + sdk: "^2.12.0" dev_dependencies: test: ^1.16.8 From 8a7a81b3888d164b32d5003c55277f2720acab16 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Mon, 15 May 2023 22:37:41 +0200 Subject: [PATCH 27/30] Formatted --- README.md | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index b9245d1..d22ced8 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Inspired by [logger](https://github.com/orhanobut/logger) for Android. **Show some ❤️ and star the repo to support the project** ### Resources: + - [Documentation](https://pub.dev/documentation/logger/latest/logger/logger-library.html) - [Pub Package](https://pub.dev/packages/logger) - [GitHub Repository](https://github.com/Bungeefan/logger) @@ -20,6 +21,7 @@ Inspired by [logger](https://github.com/orhanobut/logger) for Android. ## Getting Started Just create an instance of `Logger` and start logging: + ```dart var logger = Logger(); @@ -77,32 +79,35 @@ If you use the `PrettyPrinter`, there are more options: ```dart var logger = Logger( printer: PrettyPrinter( - methodCount: 2, // number of method calls to be displayed - errorMethodCount: 8, // number of method calls if stacktrace is provided - lineLength: 120, // width of the output - colors: true, // Colorful log messages - printEmojis: true, // Print an emoji for each log message - printTime: false // Should each log print contain a timestamp + methodCount: 2, // Number of method calls to be displayed + errorMethodCount: 8, // Number of method calls if stacktrace is provided + lineLength: 120, // Width of the output + colors: true, // Colorful log messages + printEmojis: true, // Print an emoji for each log message + printTime: false // Should each log print contain a timestamp ), ); ``` ### Auto detecting -With the `io` package you can auto detect the `lineLength` and `colors` arguments. -Assuming you have imported the `io` package with `import 'dart:io' as io;` you -can auto detect `colors` with `io.stdout.supportsAnsiEscapes` and `lineLength` +With the `io` package you can auto detect the `lineLength` and `colors` arguments. +Assuming you have imported the `io` package with `import 'dart:io' as io;` you +can auto detect `colors` with `io.stdout.supportsAnsiEscapes` and `lineLength` with `io.stdout.terminalColumns`. -You should probably do this unless there's a good reason you don't want to +You should probably do this unless there's a good reason you don't want to import `io`, for example when using this library on the web. ## LogFilter The `LogFilter` decides which log events should be shown and which don't.
-The default implementation (`DevelopmentFilter`) shows all logs with `level >= Logger.level` while in debug mode. In release mode all logs are omitted. +The default implementation (`DevelopmentFilter`) shows all logs with `level >= Logger.level` while +in debug mode. +In release mode all logs are omitted. You can create your own `LogFilter` like this: + ```dart class MyFilter extends LogFilter { @override @@ -111,8 +116,8 @@ class MyFilter extends LogFilter { } } ``` -This will show all logs even in release mode. (**NOT** a good idea) +This will show all logs even in release mode. (**NOT** a good idea) ## LogPrinter @@ -120,6 +125,7 @@ The `LogPrinter` creates and formats the output, which is then sent to the `LogO You can implement your own `LogPrinter`. This gives you maximum flexibility. A very basic printer could look like this: + ```dart class MyPrinter extends LogPrinter { @override @@ -129,7 +135,9 @@ class MyPrinter extends LogPrinter { } ``` -If you created a cool `LogPrinter` which might be helpful to others, feel free to open a pull request. :) +If you created a cool `LogPrinter` which might be helpful to others, feel free to open a pull +request. +:) ### Colors @@ -144,7 +152,7 @@ decorator to achieved colored logs for any logger: ```dart var logger = Logger( - printer: PrefixPrinter(PrettyPrinter(colors: false)) + printer: PrefixPrinter(PrettyPrinter(colors: false)) ); ``` @@ -164,12 +172,14 @@ class ConsoleOutput extends LogOutput { } ``` -Possible future `LogOutput`s could send to a file, firebase or to Logcat. Feel free to open pull requests. - +Possible future `LogOutput`s could send to a file, firebase or to Logcat. Feel free to open pull +requests. ## logger_flutter extension -The [logger_flutter](https://pub.dev/packages/logger_flutter) package is an extension for logger. You can add it to any Flutter app. Just shake the phone to show the console. +The [logger_flutter](https://pub.dev/packages/logger_flutter) package is an extension for logger. +You can add it to any Flutter app. +Just shake the phone to show the console. # Acknowledgments From d672c9c4cc205651f02df8f1b301ad88af2ac156 Mon Sep 17 00:00:00 2001 From: Bungeefan Date: Mon, 15 May 2023 22:41:50 +0200 Subject: [PATCH 28/30] Corrected ANSI notice --- README.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index d22ced8..c149d20 100644 --- a/README.md +++ b/README.md @@ -141,14 +141,16 @@ request. ### Colors -Please note that all IDEs (VSCode, XCode, Android Studio, IntelliJ) do not -support ANSI escape sequences in their terminal outputs. These escape sequences -are used to color output. If using such an IDE do not configure colored output. - -However, if you are using a JetBrains IDE (Android Studio, IntelliJ, etc.) -you can make use of the [Grep Console Plugin](https://plugins.jetbrains.com/plugin/7125-grep-console) -and the [`PrefixPrinter`](/lib/src/printers/prefix_printer.dart) -decorator to achieved colored logs for any logger: +Please note that in some cases ANSI escape sequences do not work under macOS. +These escape sequences are used to colorize the output. +This seems to be related to a Flutter bug that affects iOS builds: +https://github.com/flutter/flutter/issues/64491 + +However, if you are using a JetBrains IDE (Android Studio, IntelliJ, etc.) +you can make use of +the [Grep Console Plugin](https://plugins.jetbrains.com/plugin/7125-grep-console) +and the [`PrefixPrinter`](/lib/src/printers/prefix_printer.dart) +decorator to achieve colored logs for any logger: ```dart var logger = Logger( From 2ec1283b11c8be2b6ec7a97c2b6f615a6ff7a2c2 Mon Sep 17 00:00:00 2001 From: JMT Date: Sun, 5 Mar 2023 00:34:24 +0800 Subject: [PATCH 29/30] add custom excludePaths properties in pretty_printer --- lib/src/printers/pretty_printer.dart | 35 ++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/lib/src/printers/pretty_printer.dart b/lib/src/printers/pretty_printer.dart index 12a3a92..3c28870 100644 --- a/lib/src/printers/pretty_printer.dart +++ b/lib/src/printers/pretty_printer.dart @@ -84,6 +84,10 @@ class PrettyPrinter extends LogPrinter { /// (boxing can still be turned on for some levels by using something like excludeBox:{Level.error:false} ) final bool noBoxingByDefault; + /// To exclude user's custom path + /// for example if you made a Mylog util redirect to logger.log, + /// you can add your Mylog path in [excludePaths]. + final List excludePaths; late final Map includeBox; String _topBorder = ''; @@ -100,6 +104,7 @@ class PrettyPrinter extends LogPrinter { this.printTime = false, this.excludeBox = const {}, this.noBoxingByDefault = false, + this.excludePaths = const [], }) { _startTime ??= DateTime.now(); @@ -180,12 +185,25 @@ class PrettyPrinter extends LogPrinter { } } + bool _isInExcludePaths(String segment) { + for (var element in excludePaths) { + if (segment.startsWith(element)) { + return true; + } + } + return false; + } + bool _discardDeviceStacktraceLine(String line) { var match = _deviceStackTraceRegex.matchAsPrefix(line); if (match == null) { return false; } - return match.group(2)!.startsWith('package:logger'); + final segment = match.group(2)!; + if (segment.startsWith('package:logger')) { + return true; + } + return _isInExcludePaths(segment); } bool _discardWebStacktraceLine(String line) { @@ -193,8 +211,12 @@ class PrettyPrinter extends LogPrinter { if (match == null) { return false; } - return match.group(1)!.startsWith('packages/logger') || - match.group(1)!.startsWith('dart-sdk/lib'); + final segment = match.group(1)!; + if (segment.startsWith('packages/logger') || + segment.startsWith('dart-sdk/lib')) { + return true; + } + return _isInExcludePaths(segment); } bool _discardBrowserStacktraceLine(String line) { @@ -202,8 +224,11 @@ class PrettyPrinter extends LogPrinter { if (match == null) { return false; } - return match.group(1)!.startsWith('package:logger') || - match.group(1)!.startsWith('dart:'); + final segment = match.group(1)!; + if (segment.startsWith('package:logger') || segment.startsWith('dart:')) { + return true; + } + return _isInExcludePaths(segment); } String getTime(DateTime time) { From a635cbd5a7d5724f2aa1f3ecc34ce6b4af7377c1 Mon Sep 17 00:00:00 2001 From: shirne Date: Fri, 15 Apr 2022 17:12:39 +0800 Subject: [PATCH 30/30] force the foreground color to white for the error background --- lib/src/printers/pretty_printer.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/printers/pretty_printer.dart b/lib/src/printers/pretty_printer.dart index 3c28870..bf2cc74 100644 --- a/lib/src/printers/pretty_printer.dart +++ b/lib/src/printers/pretty_printer.dart @@ -25,6 +25,7 @@ class PrettyPrinter extends LogPrinter { static const doubleDivider = '─'; static const singleDivider = '┄'; + static final whiteColor = AnsiColor.fg(255); static final levelColors = { Level.verbose: AnsiColor.fg(AnsiColor.grey(0.5)), Level.debug: AnsiColor.none(), @@ -312,8 +313,7 @@ class PrettyPrinter extends LogPrinter { for (var line in error.split('\n')) { buffer.add( color(verticalLineAtLevel) + - errorColor.resetForeground + - errorColor(line) + + errorColor(whiteColor(line)) + errorColor.resetBackground, ); }