Skip to content
This repository was archived by the owner on Oct 18, 2024. It is now read-only.

Commit fa2486d

Browse files
Logger onLevelChanged notification (#138)
Notify when the log level is changed. Logger `onLevelChanged` broadcasts a stream of level values. Fixes #139
1 parent b75cba7 commit fa2486d

File tree

5 files changed

+60
-2
lines changed

5 files changed

+60
-2
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
## 1.1.2-wip
1+
## 1.2.0-wip
22

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

56
## 1.1.1

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ First, set the root `Level`. All messages at or above the current level are sent
3333
Then, listen on the `onRecord` stream for `LogRecord` events. The `LogRecord`
3434
class has various properties for the message, error, logger name, and more.
3535

36+
To listen for changed level notitfications use:
37+
38+
```dart
39+
Logger.root.onLevelChanged.listen((level) {
40+
print('The new log level is $level');
41+
});
42+
```
43+
3644
## Logging messages
3745

3846
Create a `Logger` with a unique name to easily identify the source of the log

lib/src/logger.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ class Logger {
5555
/// root [Logger].
5656
StreamController<LogRecord>? _controller;
5757

58+
/// Controller used to notify when the log level of this logger is changed.
59+
StreamController<Level?>? _levelChangedController;
60+
5861
/// Create or find a Logger by name.
5962
///
6063
/// Calling `Logger(name)` will return the same instance whenever it is called
@@ -139,7 +142,26 @@ class Logger {
139142
throw UnsupportedError(
140143
'Cannot set the level to `null` on a logger with no parent.');
141144
}
145+
final isLevelChanged = _level != value;
142146
_level = value;
147+
if (isLevelChanged) {
148+
_levelChangedController?.add(value);
149+
}
150+
}
151+
152+
/// Returns a stream of level values set to this [Logger].
153+
///
154+
/// You can listen for set levels using the standard stream APIs,
155+
/// for instance:
156+
///
157+
/// ```dart
158+
/// logger.onLevelChanged.listen((level) { ... });
159+
/// ```
160+
/// A state error will be thrown if the level is changed
161+
/// inside the callback.
162+
Stream<Level?> get onLevelChanged {
163+
_levelChangedController ??= StreamController<Level?>.broadcast(sync: true);
164+
return _levelChangedController!.stream;
143165
}
144166

145167
/// Returns a stream of messages added to this [Logger].

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: logging
2-
version: 1.1.2-wip
2+
version: 1.2.0-wip
33
description: >-
44
Provides APIs for debugging and error logging, similar to loggers in other
55
languages, such as the Closure JS Logger and java.util.logging.Logger.

test/logging_test.dart

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,5 +714,32 @@ void main() {
714714
expect(records[1].error, isNotNull);
715715
expect(records[2].error, isNull);
716716
});
717+
718+
test('listen for level changed', () {
719+
final levels = <Level?>[];
720+
root.level = Level.ALL;
721+
root.onLevelChanged.listen(levels.add);
722+
root.level = Level.SEVERE;
723+
root.level = Level.WARNING;
724+
expect(levels, hasLength(2));
725+
});
726+
727+
test('onLevelChanged is not emited if set the level to the same value', () {
728+
final levels = <Level?>[];
729+
root.level = Level.ALL;
730+
root.onLevelChanged.listen(levels.add);
731+
root.level = Level.ALL;
732+
expect(levels, hasLength(0));
733+
});
734+
735+
test('setting level in a loop throws state error', () {
736+
root.level = Level.ALL;
737+
root.onLevelChanged.listen((event) {
738+
// Cannot fire new event. Controller is already firing an event
739+
expect(() => root.level = Level.SEVERE, throwsStateError);
740+
});
741+
root.level = Level.WARNING;
742+
expect(root.level, Level.SEVERE);
743+
});
717744
});
718745
}

0 commit comments

Comments
 (0)