🚧 WARNING DEVELOPMENT IN PROGRESS 🚧

This package is in early stage development and might introduce breaking changes.

Retro Logger

retro_logger is a lightweight Dart package that provides a retro-styled logging system for Dart and Flutter applications. It allows you to log messages with different levels and display them using a prebuilt widget, making debugging and monitoring easier and more visually appealing.

Table of Contents

Features

  • Multiple Log Levels: Supports various log levels such as info, warning, error, success, network, UI, API, and more.
  • Retro-Styled Widget: Provides a prebuilt widget to display logs in a retro style.
  • Filtering and Searching: Easily filter logs by type and search by keywords.
  • Benchmarking Utilities: Includes utilities to benchmark synchronous and asynchronous functions.
  • Lightweight: Designed to be easy to integrate without adding significant overhead.

DEMO

Live: https://retro-logger.web.app/

Getting Started

Installation

Add retro_logger to your pubspec.yaml file:

Using Flutter:

flutter pub add retro_logger

Or manually add the dependency:

dependencies:
  retro_logger: ^0.0.1

Then, run:

flutter pub get

Prerequisites

  • Dart SDK: ^3.5.2
  • Flutter: >=1.17.0

Usage

Logging Messages

To log messages, import the retro_logger package and use the Logger class:

import 'package:retro_logger/retro_logger.dart';

void main() {
  Logger.success('This is a success message', name: 'Main');
  Logger.info('This is an info message', name: 'Main');
  Logger.warning('This is a warning message', name: 'Main');
  Logger.error('This is an error message', name: 'Main');
}
  • Note: The name parameter is a string that identifies where the log is coming from, making it easier to trace logs.

Displaying Logs

Using LogListWidget

To display logs using the pre-designed list view, use the LogListWidget:

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Retro Logger Example',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Retro Logger Example'),
        ),
        body: const LogListWidget(),
      ),
    );
  }
}

Customizing with LogManagerWidget

If you want to build your own custom log display, you can use LogManagerWidget:

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

class CustomLogWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return LogManagerWidget(
      builder: (context, logs) {
        return ListView.builder(
          itemCount: logs.length,
          itemBuilder: (context, index) {
            final log = logs[index];
            return ListTile(
              title: Text(log.message),
              subtitle: Text(log.name),
              leading: Icon(Icons.bug_report, color: Logger.getColor(log.level)),
            );
          },
        );
      },
    );
  }
}

Accessing LogManager Instance

For advanced control over logs, you can directly interact with the LogManager singleton:

final LogManager logManager = LogManager.instance;

// Adding a log manually
logManager.addLog(Log(
  name: 'CustomName',
  level: 'info',
  message: 'This is a custom log message',
  type: LogType.other,
));

// Clearing all logs
logManager.clearLogs();

// Filtering logs by type
logManager.filterLogsByTypes({LogType.error, LogType.warning});

// Searching logs
logManager.searchLogs('search query');

Filtering and Searching Logs

The LogListWidget comes with built-in filtering and searching capabilities:

  • Filtering by Log Type: Click on the filter icon in the search bar to select log types to display.
  • Searching by Keyword: Type in the search bar to filter logs containing specific keywords.

Benchmarking Functions

Use Logger's benchmarking utilities to measure the execution time of functions:

Synchronous Functions

  Logger.benchmark(()  {
    // your code here
  }, (String elapsedTime) {
    Logger.timestamp(
      'Benchmark completed in $elapsedTime',
      name: '_simulateLogs',
    );
  });

Asynchronous Functions

  await Logger.benchmarkAsync(() async {
    // your code here
  }, (String elapsedTime) {
    Logger.timestamp(
      'Benchmark completed in $elapsedTime',
      name: '_simulateLogs',
    );
  });
  • Note: The benchmark results will be logged with the timestamp log level.

Additional Information

For more detailed documentation and examples, please refer to the official documentation.

Contributing

Contributions are welcome! Please see the contributing guidelines for more information.

Issues

If you encounter any issues, please file them here. We aim to respond to issues within 48 hours.

License

This package is licensed under the MIT License. See the LICENSE file for more information.

Libraries

retro_logger