Flutter日志: 打印相对路径和代码行数

1,897 阅读1分钟

Flutter日志打印

flutter的print只会打印信息,不会打印当前文件和所在文件的行数,如果有过Java等后端语言开发经验的话,这种日志明显是不满足我们的需求的,这种日志不容易理解和调试,只有添加各种个性话tag才能理解打印的日志是在哪里调用的.

使用StackTrace打印日志的位置信息

class Log {
  static info(String message, [StackTrace stackTrace]) {
    log('INFO', message, stackTrace);
  }

  static error(String message, [StackTrace stackTrace]) {
    log('ERROR', message, stackTrace);
  }

  static warning(String message, [StackTrace stackTrace]) {
    log('WARNING', message, stackTrace);
  }

  static log(String type, String message, [StackTrace stackTrace]) {
    assert(() {
      if (stackTrace != null) {
        CustomTrace customTrace = CustomTrace(stackTrace);
        print(
            '[$type] ${customTrace.fileName}:(${customTrace.lineNumber}) - $message');
      } else {
        print('[$type] $message');
      }
      return true;
    }());
  }
}

class CustomTrace {
  final StackTrace _trace;

  String fileName;
  int lineNumber;
  int columnNumber;

  CustomTrace(this._trace) {
    _parseTrace();
  }

  void _parseTrace() {
    var traceString = this._trace.toString().split("\n")[0];
    var indexOfFileName = traceString.indexOf(RegExp(r'[A-Za-z_/]+.dart'));
    var fileInfo = traceString.substring(indexOfFileName);
    var listOfInfos = fileInfo.split(":");
    this.fileName = listOfInfos[0];
    this.lineNumber = int.parse(listOfInfos[1]);
    var columnStr = listOfInfos[2];
    columnStr = columnStr.replaceFirst(")", "");
    this.columnNumber = int.parse(columnStr);
  }
}

打印效果:I/flutter ( 6353): [INFO] demo/main.dart:(20) - star