logger method
dynamic
logger(})
logExtra
print stack frame info
name
logger.name
null: and if logExtra
==null: will use 'runtimeType'
else: will use stack frame info
stackTrace
will print with red color by dev.log
but if error
== null: will ignore stackTrace
Implementation
@visibleForTesting
@protected
logger(
String message, {
LogExtra? logExtra,
DateTime? time,
int? sequenceNumber,
int level = 0,
String? name,
Zone? zone,
Object? error,
StackTrace? stackTrace,
@Deprecated('ignore this, always true') bool uriFrame = true,
}) {
if (logExtra != null) {
try {
final t = Trace.from(stackTrace ?? StackTrace.current);
if (error == null) stackTrace = null; // ignore SkipError's red trace
final fms0 = t.terse.frames;
final fms1 = fms0.where(
(f) =>
!_kExcludedPackages.contains(f.package) &&
// for `xx_test.dart`
(f.package != null || f.uri.scheme == 'file'),
);
// print('DEBUG fms1 ${fms1.join('\n\t')}');
if (fms1.isNotEmpty) {
name = fms1.first.member;
final fm = switch (logExtra) {
LogExtra.inner => fms1.firstOrNull,
LogExtra.self => fms1.skip(1).firstOrNull,
LogExtra.outer => fms1.lastOrNull,
LogExtra.all => null,
};
final locations =
fm?.location ?? fms1.map((f) => f.location).join('\n\t');
message = '$message #> $locations';
} else {
final tips =
'\t----- DEV TIPS:'
"\tCan't show correct invoke location. Try add 'await' for VM::update method\n"
'\t${fms0.join('\n\t')}';
message = '$message #> \n$tips';
}
} catch (e, s) {
frPrint("FlowR LOGGER ERROR $e; \n$s");
}
}
frPrint(
message,
time: time,
sequenceNumber: sequenceNumber,
level: level,
name: name ?? '$runtimeType',
zone: zone,
error: error,
stackTrace: stackTrace,
);
}