logger

2.8.0

Small, easy to use and extensible logger which prints beautiful logs.

Download archive

Readme

Logger

pub package CI Last Commits Pull Requests Code size License

Small, easy to use and extensible logger which prints beautiful logs. Inspired by logger for Android.

Show some ❤️ and star the repo to support the project

Resources:

Getting Started

Just create an instance of Logger and start logging:

var logger = Logger();

logger.d("Logger is working!");

Instead of a string message, you can also pass other objects like List, Map or Set.

Output

Documentation

Log level

You can log with different levels:

logger.t("Trace log");

logger.d("Debug log");

logger.i("Info log");

logger.w("Warning log");

logger.e("Error log", error: 'Test Error');

logger.f("What a fatal log", error: error, stackTrace: stackTrace);

To show only specific log levels, you can set:

Logger.level = Level.warning;

This hides all trace, debug and info log events.

Options

When creating a logger, you can pass some options:

var logger = Logger(
  filter: null, // Use the default LogFilter (-> only log in debug mode)
  printer: PrettyPrinter(), // Use the PrettyPrinter to format and print log
  output: null, // Use the default LogOutput (-> send everything to console)
);

If you use the PrettyPrinter, there are more options:

var logger = Logger(
  printer: PrettyPrinter(
      methodCount: 2, // Number of method calls to be displayed
      errorMethodCount: 8, // Number of method calls if stacktrace is provided
      lineLength: 120, // Width of the output
      colors: true, // Colorful log messages
      printEmojis: true, // Print an emoji for each log message
      // Should each log print contain a timestamp
      dateTimeFormat: DateTimeFormat.onlyTimeAndSinceStart,
  ),
);

Auto detecting

With the io package you can auto detect the lineLength and colors arguments. Assuming you have imported the io package with import 'dart:io' as io; you can auto detect colors with io.stdout.supportsAnsiEscapes and lineLength with io.stdout.terminalColumns.

You should probably do this unless there's a good reason you don't want to import io, for example when using this library on the web.

LogFilter

The LogFilter decides which log events should be shown and which don't. The default implementation (DevelopmentFilter) shows all logs with level >= Logger.level while in debug mode (i.e., running dart with --enable-asserts). In release mode all logs are omitted.

You can create your own LogFilter like this:

class MyFilter extends LogFilter {
  @override
  bool shouldLog(LogEvent event) {
    return true;
  }
}

This will show all logs even in release mode. (NOT a good idea)

LogPrinter

The LogPrinter creates and formats the output, which is then sent to the LogOutput. You can implement your own LogPrinter. This gives you maximum flexibility.

A very basic printer could look like this:

class MyPrinter extends LogPrinter {
  @override
  List<String> log(LogEvent event) {
    return [event.message];
  }
}

If you created a cool LogPrinter which might be helpful to others, feel free to open a pull request. :)

Colors

Please note that in some cases ANSI escape sequences do not work under macOS. These escape sequences are used to colorize the output. This seems to be related to a Flutter bug that affects iOS builds: https://github.com/flutter/flutter/issues/64491

However, if you are using a JetBrains IDE (Android Studio, IntelliJ, etc.) you can make use of the Grep Console Plugin and the PrefixPrinter decorator to achieve colored logs for any logger:

var logger = Logger(
    printer: PrefixPrinter(PrettyPrinter(colors: false))
);

LogOutput

LogOutput sends the log lines to the desired destination. The default implementation (ConsoleOutput) send every line to the system console.

class ConsoleOutput extends LogOutput {
  @override
  void output(OutputEvent event) {
    for (var line in event.lines) {
      print(line);
    }
  }
}

Other provided LogOutputs are:

  • FileOutput/AdvancedFileOutput
  • StreamOutput

Possible future LogOutputs could send to Firebase or to Logcat. Feel free to open pull requests.

Acknowledgments

This package was originally created by Simon Choi, with further development by Harm Aarts, greatly enhancing its functionality over time.

Changelog

2.8.0

  • Expose separate logEvent method. Closes (#116).

2.7.0

  • Use clock for getting default log event time. Thanks to @alverone (#112).

2.6.2

  • PrettyPrinter: Fixed the showing of internal package:logger log lines in the stack trace on Flutter/Dart Web. Closes #102.
  • Lowered the meta package version requirement.

2.6.1

  • AdvancedFileOutput: Fixed race condition while flushing the buffer (StateError). Closes #99, thanks to @sap1tz.

2.6.0

  • Added log level comparison operators. Thanks to @busslina (#90).
  • AdvancedFileOutput: Added fileHeader and fileFooter options. Closes #97.

2.5.0

  • AdvancedFileOutput: Added support for custom fileUpdateDuration. Thanks to @shlowdy (#86).
  • README: Fixed outdated LogOutput documentation.

2.4.0

  • Added pub.dev topics. Thanks to @jonasfj (#74).
  • PrettyPrinter: Added dateTimeFormat option (backwards-compatible with printTime). Fixes #80.

2.3.0

  • AdvancedFileOutput: Added file deletion option. Thanks to @lomby92 (#71).

2.2.0

  • Added AdvancedFileOutput. Thanks to @pyciko (#65).
  • Added missing acknowledgments in README.

2.1.0

  • Improved README explanation about debug mode. Thanks to @gkuga (#57).
  • Added web safe export. Fixes #58.
  • Added logger.init to optionally await any async init() methods. Fixes #61.

2.0.2+1

2.0.2

  • Moved the default log level assignment to prevent weird lazy initialization bugs. Mitigates #38.

2.0.1

  • Updated README to reflect v2.0.0 log signature change.

2.0.0

  • Fixed supported platforms list.
  • Removed reference to outdated logger_flutter project. Thanks to @yangsfang (#32).
  • Added override capability for logger defaults. Thanks to @yangsfang (#34).
  • Level.verbose, Level.wtf and Level.nothing have been deprecated and are replaced by Level.trace, Level.fatal and Level.off. Additionally Level.all has been added.
  • PrettyPrinter: Added levelColors and levelEmojis as constructor parameter.

Breaking changes

  • log signature has been changed to closer match dart's developer log function and allow for future optional parameters.

    Additionally, time has been added as an optional named parameter to support providing custom timestamps for LogEvents instead of DateTime.now().

    Migration:

    • Before:
      logger.e("An error occurred!", error, stackTrace);
      
    • After:
      logger.e("An error occurred!", error: error, stackTrace: stackTrace);
      
  • init and close methods of LogFilter, LogOutput and LogPrinter are now async along with Logger.close(). (Fixes FileOutput)

  • LogListeners are now called on every LogEvent independent of the filter.

  • PrettyPrinter: includeBox is now private.

  • PrettyPrinter: errorMethodCount is now only considered if an error has been provided. Otherwise methodCount is used.

  • PrettyPrinter: Static levelColors and levelEmojis have been renamed to defaultLevelColors and defaultLevelEmojis and are used as fallback for their respective constructor parameters.

  • Levels are now sorted by their respective value instead of the enum index (Order didn't change).

1.4.0

  • Bumped upper SDK constraint to <4.0.0.
  • Added excludePaths to PrettyPrinter. Thanks to @Stitch-Taotao (#13).
  • Removed background color for Level.error and Level.wtf to improve readability.
  • Improved PrettyPrinter documentation.
  • Corrected README notice about ANSI colors.

1.3.0

  • Fixed stackTrace count when using stackTraceBeginIndex. Addresses #114.
  • Added proper FileOutput stub. Addresses #94.
  • Added isClosed. Addresses #130.
  • Added time to LogEvent.
  • Added error handling to LogfmtPrinter.

1.2.2

  • Fixed conditional LogOutput export. Credits to @ChristopheOosterlynck #4.

1.2.1

  • Reverted ${this} interpolation and added linter ignore. #1

1.2.0

  • Added origin LogEvent to OutputEvent. Addresses #133.
  • Re-added LogListener and OutputListener (Should restore compatibility with logger_flutter).
  • Replaced pedantic with lints.

1.1.0

  • Enhance boxing control with PrettyPrinter. Credits to @timmaffett
  • Add trailing new line to FileOutput. Credits to @narumishi
  • Add functions as a log message. Credits to @smotastic

1.0.0

  • Stable nullsafety

1.0.0-nullsafety.0

  • Convert to nullsafety. Credits to @DevNico

0.9.4

  • Remove broken platform detection.

0.9.3

  • Add MultiOutput. Credits to @gmpassos.
  • Handle browser Dart stacktraces in PrettyPrinter. Credits to @gmpassos.
  • Add platform detection. Credits to @gmpassos.
  • Catch output exceptions. Credits to @gmpassos.
  • Several documentation fixes. Credits to @gmpassos.

0.9.2

  • Add PrefixPrinter. Credits to @tkutcher.
  • Add HybridPrinter. Credits to @tkutcher.

0.9.1

  • Fix logging output for Flutter Web. Credits to @nateshmbhat and @Cocotus.

0.9.0

  • Remove OutputCallback and LogCallback
  • Rename SimplePrinters argument useColor to colors
  • Rename DebugFilter to DevelopmentFilter

0.8.3

  • Add LogfmtPrinter
  • Add colored output to SimplePrinter

0.8.2

  • Add StreamOutput

0.8.1

  • Deprecate callbacks

0.8.0

  • Fix SimplePrinter showTime #12
  • Remove buffer field
  • Update library structure (thanks @marcgraub!)

0.7.0+2

  • Remove screenshot

0.7.0+1

  • Fix pedantic

0.7.0

  • Added ProductionFilter, FileOutput, MemoryOutput, SimplePrinter
  • Breaking: Changed LogFilter, LogPrinter and LogOutput

0.6.0

  • Added option to output timestamp
  • Added option to disable color
  • Added LogOutput
  • Behaviour change of LogPrinter
  • Remove dependency

0.5.0

  • Added emojis
  • LogFilter is a class now

0.4.0

  • First version of the new logger

Installing

export PUB_HOSTED_URL=https://pub.mirror.p-hatan.com
flutter pub add logger
pubspec.yaml
name: logger
description: Small, easy to use and extensible logger which prints beautiful logs.
version: 2.8.0
repository: https://github.com/SourceHorizon/logger

topics:
- cli
- logging

environment:
  sdk: ">=2.17.0 <4.0.0"

dependencies:
  meta: ^1.0.0
  clock: ^1.1.0

dev_dependencies:
  test: ^1.16.8
  lints: ^2.0.1
  file: ">=6.0.0 <8.0.0"

platforms:
  android:
  ios:
  linux:
  macos:
  web:
  windows:

Version history

VersionPublishedArchiveSHA-256
0.1.0-alpha.1On demandDownload6e011987…3744d4
0.1.0On demandDownload4988f7bb…ddcbed
0.2.0On demandDownload6da327d6…2d4e01
0.3.0On demandDownload89266a90…953d05
0.3.1On demandDownloadf6899d53…758aba
0.4.0On demandDownload44d07b1a…ebef56
0.5.0On demandDownload7475ae89…b448b0
0.6.0On demandDownload80d4c1bf…1a27e8
0.7.0On demandDownloadee6d2cc1…2a1036
0.7.0+1On demandDownloadbad6eda5…ba4695
0.7.0+2On demandDownload1b48f6ef…f462fb
0.8.0On demandDownloadfdd073a2…a24bad
0.8.1On demandDownloadc9b58c30…6f708b
0.8.2On demandDownload8044df8c…0f4ce3
0.8.3On demandDownloadfec20875…dcaa24
0.9.1On demandDownloadd7101440…b9756e
0.9.2On demandDownloade3009ce7…71be3e
0.9.3On demandDownload4e8a7b81…f4ed3d
0.9.4On demandDownload040cdfa9…801899
1.0.0-nullsafety.0On demandDownload42d627fd…4d30f8
1.0.0On demandDownload6a4002cf…9087ce
1.1.0On demandDownload5076f092…49eec1
1.2.0On demandDownloadaba31543…6a9c5d
1.2.1On demandDownload3584a875…331526
1.2.2On demandDownloadc40f9ef5…c27191
1.3.0On demandDownloaddb2ff852…b3e3f7
1.4.0On demandDownload7ad7215c…b9767f
2.0.0On demandDownload49606606…ded2e7
2.0.1On demandDownload66cb0482…39da49
2.0.2On demandDownloadba3bc831…20c24a
2.0.2+1On demandDownload6bbb9d6f…e32cac
2.1.0On demandDownloadb3ff55ae…c7f770
2.2.0On demandDownload8c94b8c2…ee4e04
2.3.0On demandDownloadaf05cc87…47d4a4
2.4.0On demandDownload697d067c…29ec32
2.5.0On demandDownloadbe4b2357…f187d1
2.6.0On demandDownload2621da01…aa6999
2.6.1On demandDownload55d6c23a…b81c0c
2.6.2On demandDownloada7967e31…9f5be3
2.7.0On demandDownload25aee487…05035c
2.8.0Cached · Upstream SHA-256 matchedDownload2a0dc097…2239a7

Dependencies

clock "^1.1.0"

meta "^1.0.0"