Flutter日志记录插件logging_flutter的使用
Flutter日志记录插件logging_flutter的使用
Overview
logging_flutter
是 logging
包的 Flutter 扩展。它提供了一种简单的方法来在应用程序中记录日志,并附带了一些额外的工具。
Features
- 使用标准格式将日志打印到控制台。
- 将日志发送到第三方服务(如 Crashlytics、DataDog 等)。
- 打印触发日志的类和方法名称。
- 在应用内查看和分享所有日志。
- 捕获和格式化来自第三方包的
logging
日志。
Get Started
Initializing
使用 Flogger
静态类访问所有日志记录方法。
-
初始化日志记录器。
Flogger.init();
-
注册一个监听器,将日志打印到开发人员控制台。
if (kDebugMode) { Flogger.registerListener( (record) => log(record.printable(), stackTrace: record.stackTrace), ); }
Logging messages
使用以下方法记录不同严重程度的消息:
Flogger.d("Debug message");
Flogger.i("Info message");
Flogger.w("Warning message");
Flogger.e("Error message", stackTrace: null);
这些调用在使用默认配置时将生成以下日志:
[log] D/App SampleClass: Debug message
[log] I/App SampleClass: Info message
[log] W/App SampleClass: Warning message
[log] E/App SampleClass: Error message
Advanced Usage
Configuration
初始化 Flogger
时使用 FloggerConfig
类来配置日志的打印方式:
Flogger.init(config: FloggerConfig(
loggerName: "App",
printClassName: true,
printMethodName: false,
showDateTime: false,
showDebugLogs: true,
printer: null, // 如果设置,则忽略所有其他打印选项
));
Viewing logs inside the app
使用 LogConsole
类在应用内查看日志。
-
通过注册新的监听器将日志添加到控制台缓冲区。
Flogger.registerListener( (record) => LogConsole.add( OutputEvent(record.level, [record.printable()]), bufferSize: 1000, // 记录最后 X 条日志 ), );
-
打开日志控制台以查看所有记录的日志。
LogConsole.open(context)
Multiple Loggers
使用 loggerName
参数记录日志时,可以将其作为不同的记录器打印。这对于区分应用程序不同层中的调用非常有用。
Flogger.i("Info message", loggerName: "Network");
Flogger.w("Warning message", loggerName: "Database");
Logging to 3rd party services
注册额外的监听器,将日志发送到不同的服务。
if (kReleaseMode) {
Flogger.registerListener((record) {
// 过滤可能包含敏感数据的日志
if (record.loggerName != "App") return;
if (record.message.contains("apiKey")) return;
if (record.message.contains("password")) return;
// 将日志发送到第三方服务
FirebaseCrashlytics.instance.log(record.printable());
DatadogSdk.instance.logs?.info(record.printable());
});
}
Contributing
欢迎贡献!请随时打开一个新的问题或拉取请求来改进此项目。
Deployment
- 在
pubspec.yaml
文件中设置新版本号。 - 更新
CHANGELOG.md
文件,记录更改。 - 必要时更新
README.md
文件。 - 运行
dart doc
更新文档。 - 运行
dart pub publish --dry-run
确保包可以成功发布。 - 创建一个带有发布版本的新标签
git tag -a x.y.z -m "x.y.z" && git push --tags
。 - 导航到 GitHub Releases 并为之前创建的标签创建一个新的发布,包括
CHANGELOG.md
中的更改。 - 最后运行
dart pub publish
发布项目。
Credits
- Logging - 版权归 2013 年 Dart 项目作者所有,采用 BSD 3-Clause 许可证。
- Logger Flutter - 版权归 2019 年 Simon Leier 所有,采用 MIT License 许可证。
License
本仓库受 MIT License 保护。
示例代码
import 'dart:async';
import 'dart:developer';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:logging_flutter/logging_flutter.dart';
class SampleClass {
final String name;
final int id;
SampleClass({
required this.name,
required this.id,
});
static void printSomeLogs() {
Flogger.d("Debug message");
Flogger.i("Info message");
Flogger.i("Info message with object - ${SampleClass(name: "John", id: 1)}");
Flogger.w("Warning message");
try {
throw Exception("Something bad happened");
} catch (e) {
Flogger.w("Warning message with exception $e");
}
Flogger.e("Error message with exception - ${Exception("Test Error")}");
Flogger.i("Info message with a different logger name", loggerName: "Dio");
// throw Exception("This has been thrown");
}
}
class ExternalPackage {
static void printSomeLogs() {
Logger.root.config("Debug message");
Logger.root.info("Info message");
Logger.root.info("Info message with object - ${ExternalPackage()}");
Logger.root.warning("Warning message");
try {
throw Exception("Something bad happened");
} catch (e) {
Logger.root.info("Warning message with exception $e");
}
Logger.root.severe("Error message with exception - ${Exception("Test Error")}");
Logger("Isar").info("Info message with a different logger name");
// throw Exception("This has been thrown");
}
}
void main() {
runZonedGuarded(() {
runApp(MyApp());
init();
}, (error, stack) {
// 捕获并记录崩溃
Flogger.e('Unhandled error - $error', stackTrace: stack);
});
}
void init() {
// 初始化
Flogger.init(
config: FloggerConfig(
printClassName: true,
printMethodName: true,
showDateTime: true,
showDebugLogs: true,
),
);
if (kDebugMode) {
// 将日志发送到调试控制台
Flogger.registerListener(
(record) => log(record.printable(), stackTrace: record.stackTrace),
);
}
// 将日志发送到应用控制台
Flogger.registerListener(
(record) => LogConsole.add(
OutputEvent(record.level, [record.printable()]),
bufferSize: 1000, // 记录最后 X 条日志
),
);
// 您还可以使用 "registerListener" 将日志发送到 Crashlytics 或任何其他服务
if (kReleaseMode) {
Flogger.registerListener((record) {
// 过滤可能包含敏感数据的日志
if (record.loggerName != "App") return;
if (record.message.contains("apiKey")) return;
if (record.message.contains("password")) return;
// 将日志发送到日志服务
// FirebaseCrashlytics.instance.log(record.message);
// DatadogSdk.instance.logs?.info(record.message);
});
}
SampleClass.printSomeLogs();
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
routes: <String, WidgetBuilder>{
"home": (context) => HomeWidget(),
},
initialRoute: "home",
theme: ThemeData.dark(),
);
}
}
class HomeWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextButton(
onPressed: () => SampleClass.printSomeLogs(),
child: Text("Print some Logs")),
TextButton(
onPressed: () => ExternalPackage.printSomeLogs(),
child: Text("Print some non-flogger Logs")),
TextButton(
onPressed: () async {
await Future.delayed(Duration(milliseconds: 300));
throw Exception("An exception has been thrown");
},
child: Text("Throw Exception"),
),
SizedBox(height: 16),
Center(
child: TextButton(
onPressed: () => LogConsole.open(context),
child: Text("or click here to open Logs Console")),
),
],
),
);
}
}
以上是一个完整的示例,展示了如何使用 logging_flutter
插件进行日志记录。希望这对您有所帮助!
更多关于Flutter日志记录插件logging_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复