Skip to content

Instantly share code, notes, and snippets.

@slightfoot
Created April 11, 2019 11:02
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save slightfoot/1770dec7967def3b4d021bba8d814817 to your computer and use it in GitHub Desktop.
Save slightfoot/1770dec7967def3b4d021bba8d814817 to your computer and use it in GitHub Desktop.
Logging your app's print statements to a local file for later processing.
import 'dart:async';
import 'dart:core';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
void main() => runLoggedApp(App());
// View the log with:
// adb shell run-as <your-android-package> cat /data/data/<your-android-package>/app_flutter/log.txt
void runLoggedApp(Widget app, [String filename = 'log.txt']) async {
final log = File(p.join((await getApplicationDocumentsDirectory()).path, filename)).openWrite(mode: FileMode.append);
runZoned(() {
runApp(app);
}, zoneSpecification: ZoneSpecification(
print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
log.writeln('${DateTime.now().toIso8601String()} | $line');
log.flush();
parent.print(zone, line);
},
));
}
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
print('error!');
return Container();
}
}
@rodydavis
Copy link

Ran into some issues with the flush method, this works for me:

import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';

import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';

void runLoggedApp(Widget app, [String filename = 'log.txt']) async {
  final dir = await getApplicationDocumentsDirectory();
  final file = File(p.join(dir.path, filename));
  if (!await file.exists()) await file.create();
  final log = file.openWrite(mode: FileMode.append);
  runZoned(() {
    runApp(app);
  }, zoneSpecification: ZoneSpecification(
    print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
      log.writeln('${DateTime.now().toIso8601String()} | $line');
      // await log.flush();
      parent.print(zone, line);
    },
  ));
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment