Flutter日志记录插件ilogger的使用
Flutter日志记录插件ilogger的使用
简介
该插件提供了构建日志记录器的简单接口,大致模仿了NLog。
此包的目的不是成为你的日志记录解决方案。它的目的是只提供常见的接口以供代码使用。你应该能够在不同的项目之间传递ILogger
对象,如果它们遵循这个接口。
ILogger接口
ILogger
接口定义如下。它包含了许多默认实现:
abstract class ILogger implements ISuppress {
/// 名称
String get name;
/// 是否在[LogLevel.trace]级别启用日志记录
bool get isTraceEnabled;
/// 是否在[LogLevel.debug]级别启用日志记录
bool get isDebugEnabled;
/// 是否在[LogLevel.info]级别启用日志记录
bool get isInfoEnabled;
/// 是否在[LogLevel.warn]级别启用日志记录
bool get isWarnEnabled;
/// 是否在[LogLevel.error]级别启用日志记录
bool get isErrorEnabled;
/// 是否在[LogLevel.fatal]级别启用日志记录
bool get isFatalEnabled;
/// 检查是否在此日志记录器上启用了给定的[LogLevel]
bool isEnabled(LogLevel level);
/// 在给定的[LogLevel]级别写入诊断消息
void log(dynamic message, {required LogLevel level, Exception? exception, Map<String, dynamic>? eventProperties});
/// 在[LogLevel.trace]级别写入诊断消息
void trace(dynamic message, {Exception? exception, Map<String, dynamic>? eventProperties});
/// 在[LogLevel.debug]级别写入诊断消息
void debug(dynamic message, {Exception? exception, Map<String, dynamic>? eventProperties});
/// 在[LogLevel.info]级别写入诊断消息
void info(dynamic message, {Exception? exception, Map<String, dynamic>? eventProperties});
/// 在[LogLevel.warn]级别写入诊断消息
void warn(dynamic message, {Exception? exception, Map<String, dynamic>? eventProperties});
/// 在[LogLevel.error]级别写入诊断消息
void error(dynamic message, {Exception? exception, Map<String, dynamic>? eventProperties});
/// 在[LogLevel.fatal]级别写入诊断消息
void fatal(dynamic message, {Exception? exception, Map<String, dynamic>? eventProperties});
/// 运行操作。
///
/// 如果操作抛出异常,则该异常将记录为错误级别。异常不会传播到方法外部。
[@override](/user/override)
void swallow(Function action) {}
/// 运行提供的函数并返回其结果。
///
/// 如果抛出异常,则该异常将记录为错误级别。异常不会传播到方法外部。
///
/// 返回回退值。
[@override](/user/override)
T? swallowResult<T>(T? Function() action, [T? fallbackValue]) {
return null;
}
/// 运行异步操作。
///
/// 如果操作抛出异常,则该异常将记录为错误级别。异常不会传播到方法外部。
[@override](/user/override)
Future<void> swallowAsync(Function action) async {
return;
}
/// 运行提供的异步函数并返回其结果。
///
/// 如果抛出异常,则该异常将记录为错误级别。异常不会传播到方法外部。
///
/// 返回回退值。
[@override](/user/override)
Future<T?> swallowResultAsync<T>(Future<T?> Function() action, T? fallbackValue) async {
return null;
}
}
你应该始终考虑实现log
方法。其他方法可以根据你的需要来实现。
使用
虽然这个包不打算作为一个实际的日志记录解决方案,但它包括两个非常简单的日志记录器实现,以便让你快速上手:
BasicConsoleLogger
BasicNullLogger
BasicConsoleLogger
包含大多数方法的简单实现,并将通过 print
方法将未经过滤的消息打印到控制台:
void printLog() {
final simpleLogger = BasicConsoleLogger(name: 'mySimpleLogger');
simpleLogger.info('A simple message'); // [2023-09-12T16:47:32+5:00] INFO A Simple message ||
}
BasicNullLogger
将丢弃所有消息且不会打印任何内容:
void printLog() {
final simpleLogger = BasicConsoleLogger(name: 'myNullLogger');
simpleLogger.info('A simple message'); // nothing will be printed at all, this is a NOP
}
建议你基于这些接口合同构建自己的更复杂日志记录器。对于一个稍微高级一点的例子,可以查看 DLog Basic 仓库,其中包含了一个工作版本的简化版NLog。
完整示例
以下是一个完整的示例,展示了如何使用ILogger
接口创建自定义日志记录器:
import 'package:ilogger/ilogger.dart';
// 自定义日志记录器
final class SampleLogger extends ILogger {
[@override](/user/override)
String get name => "sample";
[@override](/user/override)
bool get isDebugEnabled => true;
[@override](/user/override)
bool get isErrorEnabled => true;
[@override](/user/override)
bool get isFatalEnabled => true;
[@override](/user/override)
bool get isInfoEnabled => true;
[@override](/user/override)
bool get isTraceEnabled => true;
[@override](/user/override)
bool get isWarnEnabled => true;
[@override](/user/override)
bool isEnabled(LogLevel level) => true;
[@override](/user/override)
void debug(message,
{Exception? exception, Map<String, dynamic>? eventProperties}) {
log(message,
level: LogLevel.debug,
exception: exception,
eventProperties: eventProperties);
}
[@override](/user/override)
void error(message,
{Exception? exception, Map<String, dynamic>? eventProperties}) {
log(message,
level: LogLevel.error,
exception: exception,
eventProperties: eventProperties);
}
[@override](/user/override)
void fatal(message,
{Exception? exception, Map<String, dynamic>? eventProperties}) {
log(message,
level: LogLevel.fatal,
exception: exception,
eventProperties: eventProperties);
}
[@override](/user/override)
void info(message,
{Exception? exception, Map<String, dynamic>? eventProperties}) {
log(message,
level: LogLevel.info,
exception: exception,
eventProperties: eventProperties);
}
[@override](/user/override)
void trace(message,
{Exception? exception, Map<String, dynamic>? eventProperties}) {
log(message,
level: LogLevel.trace,
exception: exception,
eventProperties: eventProperties);
}
[@override](/user/override)
void warn(message,
{Exception? exception, Map<String, dynamic>? eventProperties}) {
log(message,
level: LogLevel.warn,
exception: exception,
eventProperties: eventProperties);
}
[@override](/user/override)
void log(message,
{required LogLevel level,
Exception? exception,
Map<String, dynamic>? eventProperties}) {
print('${DateTime.now()} [$level] $message |$exception|$eventProperties');
}
}
void main() {
final ILogger logger = SampleLogger();
logger.info('Running example from `main` at the info level');
logger.error('Showing a sample error', exception: Exception('An error'));
logger.trace(
'Showing event properties at the trace level',
eventProperties: {
'1+1': 2,
'dogsOrCats': 'both',
'isItTrue': true,
'extraArr': ['a', 'b', 'c'],
'extraObj': {
'fieldA': 0,
'fieldB': 1,
}
},
);
}
更多关于Flutter日志记录插件ilogger的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter日志记录插件ilogger的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用ilogger
插件进行日志记录的代码示例。ilogger
是一个流行的Flutter日志记录库,它提供了灵活且强大的日志记录功能。
首先,确保你已经在pubspec.yaml
文件中添加了ilogger
依赖:
dependencies:
flutter:
sdk: flutter
ilogger: ^0.6.0 # 请检查最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中配置和使用ilogger
。以下是一个简单的示例,展示了如何设置日志记录器并在应用中记录不同级别的日志。
import 'package:flutter/material.dart';
import 'package:ilogger/ilogger.dart';
void main() {
// 初始化ilogger
Logger.level = LogLevel.verbose; // 设置日志级别
Logger.logToFile = true; // 是否将日志写入文件(仅适用于非Web平台)
Logger.logFilePath = './ilogger.log'; // 设置日志文件路径(仅适用于非Web平台)
Logger.maxLogFileSize = 1024 * 1024; // 设置日志文件最大大小(仅适用于非Web平台)
Logger.logToConsole = true; // 是否将日志输出到控制台
// 创建Flutter应用
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
void initState() {
super.initState();
// 记录不同级别的日志
Logger.verbose('This is a verbose log message.');
Logger.debug('This is a debug log message.');
Logger.info('This is an info log message.');
Logger.warn('This is a warning log message.');
Logger.error('This is an error log message.');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo Home Page'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Check the console or log file for logged messages.',
),
],
),
),
);
}
}
在这个示例中,我们做了以下几件事:
- 在
main
函数中初始化ilogger
,设置日志级别、日志文件路径、是否将日志写入文件和输出到控制台等配置。 - 在
MyHomePage
的initState
方法中,记录了几条不同级别的日志消息。 - 运行时,这些日志消息会根据配置输出到控制台或写入日志文件(在非Web平台上)。
请注意,日志文件路径和日志大小限制等配置在非Web平台上才有效。如果你在Web平台上运行此代码,请适当调整日志配置。
此外,ilogger
还支持自定义日志格式和异步日志记录等高级功能,你可以根据需求查阅其官方文档以获取更多信息。