Flutter日志监控插件flutter_logcat_monitor的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter日志监控插件flutter_logcat_monitor的使用

flutter_logcat_monitor 是一个用于通过 logcat 命令行工具监控系统消息、堆栈跟踪等的日志插件。注意,此插件仅在 Android 设备上获取 logcat 日志。

如何使用

1. 创建一个函数来消费 logcat 消息

void _mylistenStream(dynamic value) {
  if (value is String) {
    _logBuffer.writeln(value);
  }
}

2. 注册你的函数作为监听器以获取日志,并在应用中任何地方使用它

FlutterLogcatMonitor.addListen(_mylistenStream);

3. 启动 logcat 监控,传递如 logcat 工具定义的过滤参数

await FlutterLogcatMonitor.startMonitor("*.*");

安装

需要在 AndroidManifest.xml 中添加权限:

<uses-permission android:name="android.permission.READ_LOGS" />

更多安装信息请参见 pub.dev

示例代码

以下是一个完整的示例 demo,展示了如何使用 flutter_logcat_monitor 插件显示和管理日志。

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:flutter_logcat_monitor/flutter_logcat_monitor.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  StringBuffer _logBuffer = StringBuffer();
  int _groupValue = 0;

  @override
  void initState() {
    super.initState();
    initPlatformState();
  }

  Future<void> initPlatformState() async {
    try {
      debugPrint('Attempting to add listen Stream of log.');
      FlutterLogcatMonitor.addListen(_listenStream);
    } on PlatformException {
      debugPrint('Failed to listen Stream of log.');
    }
    await FlutterLogcatMonitor.startMonitor("*.*");
  }

  void _listenStream(dynamic value) {
    if (value is String) {
      if (mounted) {
        setState(() {
          _logBuffer.writeln(value);
        });
      } else {
        _logBuffer.writeln(value);
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Logcat Monitor Example App'),
        ),
        body: Column(
          children: [
            Padding(
              padding: EdgeInsets.all(4),
              child: Text("Logcat log:"),
            ),
            logBoxBuild(context),
            RadioListTile(
              title: Text("logcat filter: *.*"),
              value: 0,
              groupValue: _groupValue,
              onChanged: (int? value) async {
                setState(() {
                  _groupValue = value!;
                  _logBuffer.clear();
                });
                await FlutterLogcatMonitor.startMonitor("*.*");
              },
            ),
            RadioListTile(
              title: Text("logcat filter: flutter,FlutterLogcatMonitorPlugin,S:*"),
              value: 1,
              groupValue: _groupValue,
              onChanged: (int? value) async {
                setState(() {
                  _groupValue = value!;
                  _logBuffer.clear();
                });
                await FlutterLogcatMonitor.startMonitor("flutter:*,FlutterLogcatMonitorPlugin:*,*:S");
              },
            ),
            TextButton(
              child: Text("call debugPrint on flutter"),
              onPressed: () async {
                debugPrint("called debugPrint from flutter!");
              },
              style: TextButton.styleFrom(
                  elevation: 2, backgroundColor: Colors.amber[100]),
            ),
            TextButton(
              child: Text("Clear"),
              onPressed: () async {
                clearLog();
              },
              style: TextButton.styleFrom(
                  elevation: 2, backgroundColor: Colors.amber[100]),
            ),
          ],
        ),
      ),
    );
  }

  Widget logBoxBuild(BuildContext context) {
    return Expanded(
      child: Container(
        alignment: AlignmentDirectional.topStart,
        decoration: BoxDecoration(
          color: Colors.black,
          border: Border.all(
            color: Colors.blueAccent,
            width: 1.0,
          ),
        ),
        child: SingleChildScrollView(
          reverse: true,
          scrollDirection: Axis.vertical,
          child: Text(
            _logBuffer.toString(),
            textDirection: TextDirection.ltr,
            textAlign: TextAlign.start,
            style: TextStyle(
              color: Colors.white,
              fontSize: 14.0,
            ),
          ),
        ),
      ),
    );
  }

  void clearLog() async {
    FlutterLogcatMonitor.clearLogcat;
    await Future.delayed(const Duration(milliseconds: 100));
    setState(() {
      _logBuffer.clear();
      _logBuffer.writeln("log buffer cleared");
    });
  }
}

过滤选项

logcat 的过滤选项如下:

  • V:详细(默认)
  • D:调试(默认为 ‘*’)
  • I:信息
  • W:警告
  • E:错误
  • F:致命
  • S:静默(抑制所有输出)

例如:

  • *.* 显示所有标签和优先级。
  • flutter,FlutterLogcatMonitorPlugin,S:* 显示 flutter 和 FlutterLogcatMonitorPlugin 并抑制所有其他。

通过这些步骤和示例代码,您可以轻松地在您的 Flutter 应用中集成并使用 flutter_logcat_monitor 插件来监控日志。


更多关于Flutter日志监控插件flutter_logcat_monitor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter日志监控插件flutter_logcat_monitor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用flutter_logcat_monitor插件进行日志监控的示例代码。这个插件允许你在Flutter应用中实时监控Android日志(logcat),对于调试和监控应用行为非常有用。

1. 添加依赖

首先,你需要在你的pubspec.yaml文件中添加flutter_logcat_monitor依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_logcat_monitor: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 导入插件并初始化

在你的主文件(通常是main.dart)中,导入插件并进行初始化。你可以创建一个简单的UI来展示日志信息。

import 'package:flutter/material.dart';
import 'package:flutter_logcat_monitor/flutter_logcat_monitor.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final FlutterLogcatMonitor _logcatMonitor = FlutterLogcatMonitor();
  final TextEditingController _controller = TextEditingController();

  @override
  void initState() {
    super.initState();
    _startMonitoringLogs();
  }

  @override
  void dispose() {
    _stopMonitoringLogs();
    _controller.dispose();
    super.dispose();
  }

  void _startMonitoringLogs() {
    _logcatMonitor.startMonitoring().listen((log) {
      setState(() {
        _controller.value = _controller.value.copyWith(
          text: _controller.text + log + '\n',
          selection: TextSelection.fromPosition(
            TextPosition(
              affinity: TextAffinity.downstream,
              offset: _controller.text.length,
            ),
          ),
        );
      });
    }, onError: (error) {
      print('Error while monitoring logs: $error');
    }, onDone: () {
      print('Log monitoring stopped.');
    });
  }

  void _stopMonitoringLogs() {
    _logcatMonitor.stopMonitoring();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Logcat Monitor'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Column(
            children: [
              Expanded(
                child: TextField(
                  controller: _controller,
                  readOnly: true,
                  scrollPhysics: BouncingScrollPhysics(),
                  decoration: InputDecoration(
                    border: InputBorder.none,
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

3. 运行应用

确保你的设备或模拟器已经连接,并且你已经启用了开发者模式和USB调试。然后运行应用:

flutter run

解释

  • 依赖添加:在pubspec.yaml中添加依赖。
  • 插件初始化:在MyApp类中创建一个FlutterLogcatMonitor实例。
  • 日志监听:在initState方法中开始监听日志,将日志信息添加到TextEditingController中,以便在UI中显示。
  • 资源释放:在dispose方法中停止监听日志并释放资源。
  • UI展示:使用TextField组件以只读模式展示日志信息。

这样,你就可以在Flutter应用中实时监控Android日志了。注意,这个插件主要用于Android平台,如果你需要iOS日志监控,可能需要寻找其他解决方案或自定义实现。

回到顶部