Flutter:如何在控制台显示日志输出并自动存储?

问题描述 投票:0回答:2

我正在逐渐了解 Flutter 的日志包。最简单的事情是在控制台中按级别显示不同的日志消息,但我也想将日志输出存储到文件中,以便以后能够处理这些信息。我想知道社区中是否有人已经做过类似的事情并愿意分享对此的解释或具体实现。

flutter
2个回答
11
投票

经过更多研究并阅读了 logger 包的文档,我想分享我的代码,以防社区中的任何人将来需要做类似的事情。这会在控制台中输出日志消息,并自动将它们存储在设备本地位置的 .txt 文件中,如图所示。

enter image description here

import 'package:flutter/material.dart';
import 'package:logger/logger.dart';
import 'dart:convert';
import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:logger/src/logger.dart';
import 'package:logger/src/log_output.dart';
import 'dart:io' as io;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyLogger(),
    );
  }
}

class MyLogger extends StatefulWidget {
  @override
  _MyLoggerState createState() => _MyLoggerState();
}

class _MyLoggerState extends State<MyLogger> {
  File file;
  Logger logger;

  @override
  void initState() {
    getDirectoryForLogRecord().whenComplete(
      () {
        FileOutput fileOutPut = FileOutput(file: file);
        ConsoleOutput consoleOutput = ConsoleOutput();
        List<LogOutput> multiOutput = [fileOutPut, consoleOutput];
        logger = Logger(
            filter: DevelopmentFilter(),
            // Use the default LogFilter (-> only log in debug mode)
            printer: PrettyPrinter(
                methodCount: 2,
                // number of method calls to be displayed
                errorMethodCount: 8,
                // number of method calls if stacktrace is provided
                lineLength: 120,
                // width of the output
                colors: true,
                // Colorful log messages
                printEmojis: false,
                // Print an emoji for each log message
                printTime: true // Should each log print contain a timestamp
                ),
            // Use the PrettyPrinter to format and print log
            output:
                MultiOutput(multiOutput) // Use the default LogOutput (-> send everything to console)
            );
      },
    );
    // TODO: implement initState
    super.initState();
  }

  Future<void> getDirectoryForLogRecord() async {
    final Directory directory = await getApplicationDocumentsDirectory();
    file = File('${directory.path}/withMultiOutput.txt');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: FlatButton(
          onPressed: () {
            print("you pressed it");
            logger.v("Verbose log");

            logger.d("Debug log");

            logger.i("Info log");

            logger.w("Warning log");

            logger.e("Error log");

            logger.wtf("What a terrible failure log");
          },
          height: 60,
          minWidth: 120,
          color: Colors.blue,
          child: Text(
            'TEST WITH BOTH',
            style: TextStyle(color: Colors.white),
          ),
        ),
      ),
    );
  }
}

/// Writes the log output to a file.
class FileOutput extends LogOutput {
  final File file;
  final bool overrideExisting;
  final Encoding encoding;
  IOSink _sink;

  // IOSink? _sink;

  FileOutput({
    @required this.file,
    this.overrideExisting = false,
    this.encoding = utf8,
  });

  @override
  void init() {
    _sink = file.openWrite(
      mode: overrideExisting ? FileMode.writeOnly : FileMode.writeOnlyAppend,
      encoding: encoding,
    );
  }

  @override
  void output(OutputEvent event) {
    _sink?.writeAll(event.lines, '\n');
  }

  @override
  void destroy() async {
    await _sink?.flush();
    await _sink?.close();
  }
}

0
投票

我像这样实现了你的解决方案,但它不起作用,有帮助吗

enter code here
import 'dart:io';
import 'package:logger/logger.dart';
import 'package:path_provider/path_provider.dart';
import "helpers.dart";
class Log {
  File? _file;
  Logger? _logger;

  Log(){
    this.init();
  }

  static var log = Logger(
    printer: PrettyPrinter(
    methodCount: 3
  ),
  );

  static var logwithoutstack = Logger(
    printer: PrettyPrinter(methodCount: 8),
  );

  File? get file => _file;

  Log setFile(File file) {
   this._file = file;
   return this;
  }

  Logger get logger => _logger??log;

  Log setLogger(Logger file) {
   this._logger = logger;
   return this;
  }

  init(){
   try{
  getDirectoryForLogRecord().whenComplete(
          (){
        if(file is! File) return;
        MyFileOutput fileOutput = MyFileOutput(file: file!);
        ConsoleOutput consoleOutput = ConsoleOutput();
        List<LogOutput> multiOutput = [fileOutput,consoleOutput];
        this.setLogger(
            Logger(
                filter: DevelopmentFilter(),
                printer: PrettyPrinter(
                  methodCount: 2,
                  errorMethodCount: 8,
                  lineLength: 120,
                  colors:true,
                  printEmojis: false,
                  dateTimeFormat: DateTimeFormat.dateAndTime,
                ),
                output: MultiOutput(multiOutput)
            )
        );

      }
     );
     }catch(err){
       print(err);
     }

     }

    Future<void> getDirectoryForLogRecord() async {
     final Directory directory = await getApplicationDocumentsDirectory();
     print('${directory.path}/log_output.txt');
     this.setFile(File('${directory.path}/log_output.txt'));
    }

    }
© www.soinside.com 2019 - 2024. All rights reserved.