Flutter日志监控插件logcat_monitor的使用

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

Flutter日志监控插件logcat_monitor的使用

Flutter插件logcat_monitor允许通过命令行工具logcat监控系统消息、堆栈跟踪等流。需要注意的是,此插件目前仅在Android设备上获取日志。

使用方法

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

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

2. 注册你的函数作为监听器以获取日志,并在应用内按需使用。

LogcatMonitor.addListen(_mylistenStream);

3. 启动logcat监视器,传递类似于logcat工具中定义的过滤参数。

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

安装

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

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

安装详情请参考:https://pub.dev/packages/logcat_monitor/install

示例

下面是一个完整的示例代码,用于展示如何在Flutter项目中集成和使用logcat_monitor

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

import 'package:flutter/services.dart';
import 'package:logcat_monitor/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 {
      LogcatMonitor.addListen(_listenStream);
    } on PlatformException {
      debugPrint('Failed to listen Stream of log.');
    }
    await LogcatMonitor.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('Logcat Monitor example app'),
        ),
        body: Column(
          children: [
            Text("Logcat log:"),
            logboxBuild(context),
            Column(
              children: [
                RadioListTile(
                  title: Text("logcat filter: *.*"),
                  value: 0,
                  groupValue: _groupValue,
                  onChanged: (value) async {
                    setState(() {
                      _groupValue = value;
                      _logBuffer.clear();
                    });
                    await LogcatMonitor.startMonitor("*.*");
                  },
                ),
                RadioListTile(
                  title: Text("logcat filter: flutter,LogcatMonPlugin,S:*"),
                  value: 1,
                  groupValue: _groupValue,
                  onChanged: (value) async {
                    setState(() {
                      _groupValue = value;
                      _logBuffer.clear();
                    });
                    await LogcatMonitor.startMonitor(
                        "flutter:*,LogcatMonPlugin:*,*: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: Center(
        child: Container(
          decoration: BoxDecoration(
            color: Colors.black,
            border: Border.all(
              color: Colors.blueAccent,
              width: 1.0,
            ),
          ),
          child: Scrollbar(
            thickness: 10,
            radius: Radius.circular(20),
            child: SingleChildScrollView(
              reverse: true,
              scrollDirection: Axis.vertical,
              child: Text(
                _logBuffer.toString(),
                style: TextStyle(
                  color: Colors.white,
                  fontSize: 14.0,
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }

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

这个示例展示了如何设置和配置logcat_monitor来捕获和显示日志信息。通过切换不同的过滤选项,可以控制哪些类型的日志被显示。此外,还提供了一个按钮用于触发debugPrint,以及一个清除日志的按钮。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用logcat_monitor插件进行日志监控的代码示例。这个插件可以帮助你在Flutter应用中实时监控Android设备的日志输出。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  logcat_monitor: ^0.4.0  # 请检查最新版本号

2. 导入插件

在你的Dart文件中(例如main.dart),导入logcat_monitor插件:

import 'package:logcat_monitor/logcat_monitor.dart';

3. 初始化并使用插件

你可以在应用启动时初始化LogcatMonitor,并设置监听器来接收日志信息。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Logcat Monitor Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: LogcatMonitorScreen(),
    );
  }
}

class LogcatMonitorScreen extends StatefulWidget {
  @override
  _LogcatMonitorScreenState createState() => _LogcatMonitorScreenState();
}

class _LogcatMonitorScreenState extends State<LogcatMonitorScreen> {
  final LogcatMonitor _logcatMonitor = LogcatMonitor();
  final List<String> _logs = [];

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

  void _startMonitoringLogs() {
    _logcatMonitor.startMonitoring((log) {
      // 这里可以根据需要过滤日志级别或内容
      setState(() {
        _logs.add(log);
      });
    });
  }

  @override
  void dispose() {
    _logcatMonitor.stopMonitoring();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Logcat Monitor'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: ListView.builder(
          itemCount: _logs.length,
          itemBuilder: (context, index) {
            return Text(_logs[index]);
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 这里可以添加停止监控或其他功能按钮
          // 例如:_logcatMonitor.stopMonitoring();
        },
        tooltip: 'Stop Monitoring',
        child: Icon(Icons.stop),
      ),
    );
  }
}

4. 运行应用

确保你的开发环境已经正确设置,并且你已经连接了一个Android设备或启动了Android模拟器。然后运行你的Flutter应用:

flutter run

说明

  • initState方法中,我们启动了日志监控,并将接收到的日志添加到_logs列表中。
  • dispose方法中,我们停止了日志监控,以避免内存泄漏。
  • ListView.builder用于在UI中显示日志列表。
  • 你可以根据需要添加过滤逻辑,以仅显示特定级别或包含特定关键字的日志。

这个示例展示了如何使用logcat_monitor插件在Flutter应用中实时监控Android日志。如果你有更具体的需求或遇到问题,请查阅该插件的官方文档或GitHub仓库以获取更多信息和支持。

回到顶部