logging_collector 0.0.10 copy "logging_collector: ^0.0.10" to clipboard
logging_collector: ^0.0.10 copied to clipboard

Package for logs sharing.

example/lib/main.dart

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

import 'package:archive/archive_io.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:logging_collector/logging_collector.dart';
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart';
import 'package:share_plus/share_plus.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // setup logs directory
  final Directory docsDirectory = await getApplicationDocumentsDirectory();
  final logsDirectoryPath = '${docsDirectory.path}/logs';
  final logsDirectory = Directory(logsDirectoryPath);
  logsDirectory.createSync();

  // create RollingFileAppender, it'll write log messages into logs directory
  final appenders = [
    RollingFileAppender(
      directoryPath: logsDirectoryPath,
      fileMaxSize: 1024 * 1024,
      fileMaxCount: 3,
    ),
  ];

  // setup logging
  Logger.root.level = Level.ALL;

  Logger.root.onRecord.listen(
    (LogRecord record) async {
      String log;
      if (record.error != null) {
        log = '${record.level.name}: ${record.time}: ${record.loggerName}:'
            ' ${record.message}: ${record.error}\n'
            'stackTrace\n${record.stackTrace}\n';
      } else {
        log = '${record.level.name}: ${record.time}: ${record.loggerName}:'
            ' ${record.message}\n';
      }

      for (final appender in appenders) {
        await appender.append(log);
      }
    },
  );

  // create logs collector config
  final loggingCollectorConfig = LoggingCollectorConfig(
    logsDirectoryPath,
    _CustomSharingDelegate(logsDirectory),
  );

  runApp(
    Provider<LoggingCollectorConfig>.value(
      value: loggingCollectorConfig,
      child: const MyApp(),
    ),
  );
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _logger = Logger('MyApp');

  @override
  void initState() {
    super.initState();
    Timer.periodic(
      const Duration(seconds: 2),
      (timer) {
        _logger.fine('message id ${Random().nextDouble()}');
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.green),
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: const Placeholder(),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.of(context).push(
            CupertinoPageRoute(
                builder: (context) => LoggingCollectorWidget(context.read())),
          );
        },
        child: const Icon(Icons.add),
      ),
    );
  }
}

class _CustomSharingDelegate implements LogsSharingDelegate {
  final Directory _logsDirectory;

  _CustomSharingDelegate(this._logsDirectory);

  @override
  Future<void> share() async {
    final zipEncoder = ZipFileEncoder();
    final zipPath = '../${_logsDirectory.path}/logs.zip';
    zipEncoder.zipDirectory(
      _logsDirectory,
      filename: zipPath,
    );

    Share.shareXFiles(
      [XFile(zipPath)],
      subject: 'Share',
      text: 'Share logs',
    );
  }
}
0
likes
130
points
31
downloads

Publisher

unverified uploader

Weekly Downloads

Package for logs sharing.

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

equatable, flutter, flutter_bloc, provider

More

Packages that depend on logging_collector