Flutter日志管理插件logecom的使用
Flutter日志管理插件logecom的使用
Logecom介绍
Logecom
是一个简单但强大的基于中间件的日志工具,灵感来源于 Node.js Express 库。它提供了一个抽象的日志处理过程,并定义了一个简单的且功能丰富的接口,以最小化开销并提供一个栈来实现任何具有所需功能的日志流水线。
基本接口包括:
LogTranslator
通过不同的方式实现 LogTranslator
,可以达到任何结果。你可以转换、格式化、收集、打印或发送日志,甚至使用另一个日志器!一切都可以在单个地方实现。
特性
Logecom
提供了几个“现成”的 LogTranslator
实现,覆盖了最常见的日志用例:
HttpFormatter
- 用于轻松记录 HTTP 交互ConsoleTransport
- 默认控制台打印机。提供简单的且紧凑的日志条目格式化方法,可以通过stdout
、stderr
、developer.log()
或print()
方法进行打印
开始使用
要开始使用 Logecom
日志器,首先需要配置所需的流水线。
默认情况下没有配置。通常除了简单的文本事件外,你可能还需要找到和格式化 HTTP 日志条目,并捕获所有未处理的错误。
对于 Flutter 应用程序,配置可能如下:
void main() {
final method = PrintingMethod.stdErr;
// 典型的日志流水线
Logecom.instance.pipeline = [
HttpFormatter(
printRpcContent: config.logPrintRpcContent,
hideAuthData: config.logHideAuthData,
colorize: method == PrintingMethod.stdErr || method == PrintingMethod.stdOut,
),
ConsoleTransport(
config: ConsoleTransportConfig(
printingMethod: method,
timestampFormat: method == PrintingMethod.print ? '' : 'yyyy-mm-dd HH:MM:ss.S',
),
),
];
// 这个 logger 用于指定未分类(全局)事件
final logger = Logecom.createLogger('Global');
FlutterError.onError = (FlutterErrorDetails details) {
logger.error('Flutter Error', [details.exception, details.stack]);
};
void onUnhandledException(Object error, StackTrace stack) {
logger.error('Unhandled Exception', [error, '\n$stack']);
}
Isolate.current.addErrorListener(RawReceivePort((List<dynamic> pair) async {
final error = pair.first;
final StackTrace stack = pair.last;
logger.error('Unhandled Isolate Error', [error, '\n$stack']);
}).sendPort);
/// 所有应用程序代码必须在这个函数内
/// 以正确处理所有错误
void bootstrap() {
// [AppView] 是你的应用程序入口组件
runApp(AppView());
}
runZonedGuarded(bootstrap, onUnhandledException);
}
使用
要使用常见的日志 API,你需要创建一个带有特定类别的特定 Logger
实例,类别通常表示事件源。一个好的实践是使用当前类或包名作为此目的。
class AppViewState extends State<AppView> {
// 可以传递类类型或任何所需的字符串
final logger = Logecom.createLogger(AppView);
@override
void initState() {
super.initState();
// 使用 logger 实例来记录事件
logger.log('State initialized');
}
}
使用默认的 ConsoleTransport
,上述代码将打印以下内容:
2021-06-19 22:12:43.326 [LOG] AppView State initialized
注意: 如果你没有看到任何日志:
检查是否设置了正确的 printingMethod
到 ConsoleTransportConfig
。 不是所有打印方法都适用于所有环境。 例如,如果你为运行在 iPhone 模拟器中的 Flutter 应用程序设置 PrintingMethod.stdErr
,则不会看到任何日志!这是一个已知的问题。请参阅 PrintingMethod
内部文档获取更多信息。
记录 Dio HTTP 请求
Dio
是一个流行的 HTTP 客户端库,可以在 pub.dev 上找到。要记录其请求,可以使用 Interceptor
实现如下:
import 'package:dio/dio.dart';
import 'package:logecom/logecom.dart';
class DioLogInterceptor extends Interceptor {
DioLogInterceptor(this._logger);
final Logger _logger;
final _requestStartTime = Map<RequestOptions, DateTime>();
@override
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
_requestStartTime[options] = DateTime.now();
handler.next(options);
}
@override
void onError(DioError err, ErrorInterceptorHandler handler) {
final startTime = _requestStartTime[err.requestOptions] ?? DateTime.now();
_requestStartTime.remove(err.requestOptions);
_logger.log(
'HTTP',
HttpLogContext(
method: err.requestOptions.method,
url: err.requestOptions.uri,
statusCode: err.response?.statusCode ?? -1,
statusMessage: err.response?.statusMessage ?? err.message,
duration: DateTime.now().difference(startTime),
responseData: err.response?.data,
requestData: err.response?.requestOptions.data,
headers: _getHeaders(err.requestOptions.headers),
),
);
handler.next(err);
}
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
final startTime = _requestStartTime[response.requestOptions] ?? DateTime.now();
_requestStartTime.remove(response.requestOptions);
_logger.log(
'HTTP',
HttpLogContext(
method: response.requestOptions.method,
url: response.requestOptions.uri,
statusCode: response.statusCode ?? 0,
statusMessage: response.statusMessage ?? '',
duration: DateTime.now().difference(startTime),
responseData: response.data,
requestData: response.requestOptions.data,
headers: _getHeaders(response.requestOptions.headers),
),
);
handler.next(response);
}
Map<String, String> _getHeaders(Map<String, dynamic> headers) {
return headers.map((key, value) {
if (value is String) {
return MapEntry(key, value);
} else if (value is List) {
return MapEntry(key, value.join('; '));
} else {
return MapEntry(key, value.toString());
}
});
}
}
使用示例如下:
class AuthService {
AuthService() {
client.interceptors.addAll([
DioLogInterceptor(logger),
]);
}
final logger = Logecom.createLogger(AuthService);
final client = Dio();
...
}
更多关于Flutter日志管理插件logecom的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter日志管理插件logecom的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用logecom
插件进行日志管理的代码示例。logecom
是一个用于日志管理的Flutter插件,它允许你在应用中轻松地记录、管理和输出日志。
首先,你需要在你的pubspec.yaml
文件中添加logecom
依赖:
dependencies:
flutter:
sdk: flutter
logecom: ^最新版本号 # 请替换为实际的最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter应用中初始化并使用logecom
进行日志记录。以下是一个完整的示例:
1. 初始化logecom
在你的应用入口文件(通常是main.dart
)中,初始化logecom
:
import 'package:flutter/material.dart';
import 'package:logecom/logecom.dart';
void main() {
// 初始化logecom
Logecom.init(
level: LogLevel.verbose, // 设置日志级别
saveToFile: true, // 是否将日志保存到文件
filePath: '/path/to/your/logfile.log', // 日志文件路径(在Android上可以使用内部存储路径)
);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
2. 使用logecom
记录日志
在应用的任意位置使用Logecom
的方法记录日志:
import 'package:flutter/material.dart';
import 'package:logecom/logecom.dart';
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
// 记录日志示例
Logecom.v('这是一个 Verbose 日志');
Logecom.d('这是一个 Debug 日志');
Logecom.i('这是一个 Info 日志');
Logecom.w('这是一个 Warning 日志');
Logecom.e('这是一个 Error 日志');
return Scaffold(
appBar: AppBar(
title: Text('Flutter Logecom 示例'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'点击按钮记录日志',
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// 在按钮点击时记录一个自定义日志
Logecom.i('按钮被点击了');
},
child: Text('记录日志'),
),
],
),
),
);
}
}
3. 查看日志
- 控制台输出:在开发过程中,日志会输出到控制台,你可以通过运行
flutter run
来查看。 - 日志文件:如果你设置了
saveToFile: true
,日志还会被保存到指定的文件路径中。在Android设备上,你可能需要使用ADB工具将日志文件从设备中导出到本地查看。
注意事项
- 确保你指定的日志文件路径在设备上是有写权限的。
- 在iOS上,你可能需要在
Info.plist
中添加相应的文件访问权限。 - 在生产环境中,建议将日志级别设置为较高的级别(如
LogLevel.error
),以减少日志量和避免敏感信息泄露。
这个示例展示了如何在Flutter应用中使用logecom
插件进行日志管理。你可以根据自己的需求进一步配置和使用这个插件。