Skip to content
This repository was archived by the owner on Oct 18, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
## 1.1.2-wip
## 1.2.0-wip

* Add notification when the log level is changed. Logger `onLevelChanged` broadcasts a stream of level values.
* Require Dart 2.19.

## 1.1.1
Expand Down
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,14 @@ First, set the root `Level`. All messages at or above the current level are sent
Then, listen on the `onRecord` stream for `LogRecord` events. The `LogRecord`
class has various properties for the message, error, logger name, and more.

To listen for changed level notitfications use:

```dart
Logger.root.onLevelChanged.listen((level) {
print('The new log level is $level');
});
```

## Logging messages

Create a `Logger` with a unique name to easily identify the source of the log
Expand Down
22 changes: 22 additions & 0 deletions lib/src/logger.dart
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ class Logger {
/// root [Logger].
StreamController<LogRecord>? _controller;

/// Controller used to notify when the log level of this logger is changed.
StreamController<Level?>? _levelChangedController;

/// Create or find a Logger by name.
///
/// Calling `Logger(name)` will return the same instance whenever it is called
Expand Down Expand Up @@ -139,7 +142,26 @@ class Logger {
throw UnsupportedError(
'Cannot set the level to `null` on a logger with no parent.');
}
final isLevelChanged = _level != value;
_level = value;
if (isLevelChanged) {
_levelChangedController?.add(value);
}
}

/// Returns a stream of level values set to this [Logger].
///
/// You can listen for set levels using the standard stream APIs,
/// for instance:
///
/// ```dart
/// logger.onLevelChanged.listen((level) { ... });
/// ```
/// A state error will be thrown if the level is changed
/// inside the callback.
Stream<Level?> get onLevelChanged {
_levelChangedController ??= StreamController<Level?>.broadcast(sync: true);
return _levelChangedController!.stream;
}

/// Returns a stream of messages added to this [Logger].
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: logging
version: 1.1.2-wip
version: 1.2.0-wip
description: >-
Provides APIs for debugging and error logging, similar to loggers in other
languages, such as the Closure JS Logger and java.util.logging.Logger.
Expand Down
27 changes: 27 additions & 0 deletions test/logging_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -714,5 +714,32 @@ void main() {
expect(records[1].error, isNotNull);
expect(records[2].error, isNull);
});

test('listen for level changed', () {
final levels = <Level?>[];
root.level = Level.ALL;
root.onLevelChanged.listen(levels.add);
root.level = Level.SEVERE;
root.level = Level.WARNING;
expect(levels, hasLength(2));
});

test('onLevelChanged is not emited if set the level to the same value', () {
final levels = <Level?>[];
root.level = Level.ALL;
root.onLevelChanged.listen(levels.add);
root.level = Level.ALL;
expect(levels, hasLength(0));
});

test('setting level in a loop throws state error', () {
root.level = Level.ALL;
root.onLevelChanged.listen((event) {
// Cannot fire new event. Controller is already firing an event
expect(() => root.level = Level.SEVERE, throwsStateError);
});
root.level = Level.WARNING;
expect(root.level, Level.SEVERE);
});
});
}