blob: 4f11642218136197082159f198269ecef4d03515 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'dart:developer' as developer;
import 'package:flutter/foundation.dart';
import 'package:logging/logging.dart';
/// The logger for this package.
@visibleForTesting
final Logger logger = Logger('GoRouter');
/// Whether or not the logging is enabled.
bool _enabled = false;
/// Logs the message if logging is enabled.
void log(String message, {Level level = Level.INFO}) {
if (_enabled) {
logger.log(level, message);
}
}
StreamSubscription<LogRecord>? _subscription;
/// Forwards diagnostic messages to the dart:developer log() API.
void setLogging({bool enabled = false}) {
_subscription?.cancel();
_enabled = enabled;
if (!enabled || hierarchicalLoggingEnabled) {
return;
}
_subscription = logger.onRecord.listen((LogRecord e) {
// use `dumpErrorToConsole` for severe messages to ensure that severe
// exceptions are formatted consistently with other Flutter examples and
// avoids printing duplicate exceptions
if (e.level >= Level.SEVERE) {
final Object? error = e.error;
FlutterError.dumpErrorToConsole(
FlutterErrorDetails(
exception: error is Exception ? error : Exception(error),
stack: e.stackTrace,
library: e.loggerName,
context: ErrorDescription(e.message),
),
);
} else {
_developerLogFunction(e);
}
});
}
void _developerLog(LogRecord record) {
developer.log(
record.message,
time: record.time,
sequenceNumber: record.sequenceNumber,
level: record.level.value,
name: record.loggerName,
zone: record.zone,
error: record.error,
stackTrace: record.stackTrace,
);
}
/// A function that can be set during test to mock the developer log function.
@visibleForTesting
void Function(LogRecord)? testDeveloperLog;
/// The function used to log messages.
void Function(LogRecord) get _developerLogFunction =>
testDeveloperLog ?? _developerLog;