logger method

dynamic logger(
  1. String message, {
  2. LogExtra? logExtra,
  3. bool uriFrame = false,
  4. DateTime? time,
  5. int? sequenceNumber,
  6. int level = 0,
  7. String? name,
  8. Zone? zone,
  9. Object? error,
  10. StackTrace? stackTrace,
})
inherited

logExtra print stack frame info; (at log.name) uriFrame show logExtra uri; (at log.message)

Implementation

logger(
  String message, {
  LogExtra? logExtra,
  bool uriFrame = false,
  DateTime? time,
  int? sequenceNumber,
  int level = 0,
  String? name, // null will use 'stateKey'
  Zone? zone,
  Object? error,
  StackTrace? stackTrace,
}) {
  if (logExtra != null) {
    try {
      final t = Trace.from(StackTrace.current);
      // print('debug trace\n$t');
      final maxAt = t.frames.length - 1;
      int targetFrame = 0;
      for (final t in t.frames) {
        if (!'${t.uri}'.startsWith('package:flowr_dart/')) break;
        targetFrame++;
      }
      final memberUriFm = switch (logExtra) {
        LogExtra.inner => (-1, 0),
        LogExtra.self => (0, 1),
        LogExtra.outer => (0, 2),
        LogExtra.all => (0, null)
      };
      final at = targetFrame + memberUriFm.$1;
      name = t.frames[min(at, maxAt)].member;
      //
      if (uriFrame) {
        final atOffset = memberUriFm.$2;
        if (atOffset != null) {
          final at = targetFrame + atOffset;
          final fm = t.frames[min(at, maxAt)];
          final location = fm.location;
          final tips = location.startsWith('package:flowr_dart/')
              ? '\t ----- DEV TIPS ----- \n'
                  '\t Can not show correct location. You may need add "await" for VM::updateRaw method\n'
                  '\t -----'
              : '';
          message = '$message #> $location\n$tips';
        } else {
          message = '$message #> \n${t.frames.join('\n')}';
        }
      }
    } 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);
}