如何在 Flutter 中检索 logcat?
How to retrieve logcat in Flutter?
如何将写入 logcat 的输出返回到导致它的 Flutter 应用程序中?或者更简单的问题:How to read logcat in Flutter?
问题是这样的:
该应用使用一堆 Android 插件通过蓝牙与一些自定义硬件通信。那些 Android 插件大量写入 logcat。现在,对于调试,能够读取应用程序(包括本机插件)写入的所有消息非常有帮助logcat。问题是,这有可能吗?
你会如何解决这个问题?
在 pub.dev 上查看名为 logcat 的插件。
遗憾的是,它似乎不再维护,也没有针对空安全性进行更新。
但是您可以查看源代码 here 并查看插件如何访问 android logcat.
因为 logcat 是原生的,你必须使用 MethodChannel 来调用 Java/Kotlin 函数:
// define MethodChannel
final platform = const MethodChannel('app.channel.logcat');
// call native method
logs = await platform.invokeMethod('execLogcat');
和原生部分:
public class LogcatPlugin implements MethodCallHandler {
public static void registerWith(Registrar registrar) {
final MethodChannel channel = new MethodChannel(registrar.messenger(), "app.channel.logcat");
channel.setMethodCallHandler(new LogcatPlugin());
}
@Override
public void onMethodCall(MethodCall call, Result result) {
if (call.method.equals("execLogcat")) {
String logs = getLogs();
if (logs != null) {
result.success(logs);
} else {
result.error("UNAVAILABLE", "logs not available.", null);
}
} else {
result.notImplemented();
}
}
String getLogs() {
try {
Process process = Runtime.getRuntime().exec("logcat -d");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder log = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
log.append(line);
}
return log.toString();
} catch (IOException e) {
return "EXCEPTION" + e.toString();
}
}
}
代码示例来自github.com/pharshdev/logcat。
如果需要,也许您可以直接分叉 git 存储库并将其迁移到 null safety。
添加依赖:
dependencies:
logger: ^1.1.0
示例:
import 'package:logger/logger.dart';
var logger = Logger(
printer: PrettyPrinter(),
);
var loggerNoStack = Logger(
printer: PrettyPrinter(methodCount: 0),
);
void main() {
print(
'Run with either `dart example/main.dart` or `dart --enable-asserts example/main.dart`.');
demo();
}
void demo() {
logger.d('Log message with 2 methods');
loggerNoStack.i('Info message');
loggerNoStack.w('Just a warning!');
logger.e('Error! Something bad happened', 'Test Error');
loggerNoStack.v({'key': 5, 'value': 'something'});
Logger(printer: SimplePrinter(colors: true)).v('boom');
}
如何将写入 logcat 的输出返回到导致它的 Flutter 应用程序中?或者更简单的问题:How to read logcat in Flutter?
问题是这样的:
该应用使用一堆 Android 插件通过蓝牙与一些自定义硬件通信。那些 Android 插件大量写入 logcat。现在,对于调试,能够读取应用程序(包括本机插件)写入的所有消息非常有帮助logcat。问题是,这有可能吗?
你会如何解决这个问题?
在 pub.dev 上查看名为 logcat 的插件。
遗憾的是,它似乎不再维护,也没有针对空安全性进行更新。 但是您可以查看源代码 here 并查看插件如何访问 android logcat.
因为 logcat 是原生的,你必须使用 MethodChannel 来调用 Java/Kotlin 函数:
// define MethodChannel
final platform = const MethodChannel('app.channel.logcat');
// call native method
logs = await platform.invokeMethod('execLogcat');
和原生部分:
public class LogcatPlugin implements MethodCallHandler {
public static void registerWith(Registrar registrar) {
final MethodChannel channel = new MethodChannel(registrar.messenger(), "app.channel.logcat");
channel.setMethodCallHandler(new LogcatPlugin());
}
@Override
public void onMethodCall(MethodCall call, Result result) {
if (call.method.equals("execLogcat")) {
String logs = getLogs();
if (logs != null) {
result.success(logs);
} else {
result.error("UNAVAILABLE", "logs not available.", null);
}
} else {
result.notImplemented();
}
}
String getLogs() {
try {
Process process = Runtime.getRuntime().exec("logcat -d");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder log = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
log.append(line);
}
return log.toString();
} catch (IOException e) {
return "EXCEPTION" + e.toString();
}
}
}
代码示例来自github.com/pharshdev/logcat。 如果需要,也许您可以直接分叉 git 存储库并将其迁移到 null safety。
添加依赖:
dependencies:
logger: ^1.1.0
示例:
import 'package:logger/logger.dart';
var logger = Logger(
printer: PrettyPrinter(),
);
var loggerNoStack = Logger(
printer: PrettyPrinter(methodCount: 0),
);
void main() {
print(
'Run with either `dart example/main.dart` or `dart --enable-asserts example/main.dart`.');
demo();
}
void demo() {
logger.d('Log message with 2 methods');
loggerNoStack.i('Info message');
loggerNoStack.w('Just a warning!');
logger.e('Error! Something bad happened', 'Test Error');
loggerNoStack.v({'key': 5, 'value': 'something'});
Logger(printer: SimplePrinter(colors: true)).v('boom');
}