consoleFormatter property

LoggerFormatter consoleFormatter
getter/setter pair

Console log message formatter with ANSI color codes. Formats the log message with colored timestamp, level, scope, message, and exception if present. And uses ansicolors to differentiate log levels.

Implementation

static LoggerFormatter consoleFormatter =
    (LogContext context, LoggerDateFormatter? dateFormatter) {
      final buffer = IndentingStringBuffer();

      // Timestamp: Grey
      buffer.writeRaw('\x1B[90m');
      final now = context.timestamp;
      final timeString = dateFormatter != null
          ? dateFormatter(now)
          : defaultDateFormatter(now);
      buffer.writeRaw(timeString);
      buffer.writeRaw('\x1B[0m');

      buffer.writeRaw(' ');

      // Level: Colored
      String levelColor = '';
      switch (context.level) {
        case Level.FINER:
        case Level.FINE:
        case Level.CONFIG:
        case Level.INFO:
          levelColor = '\x1B[32m'; // Green
          break;
        case Level.WARNING:
          levelColor = '\x1B[33m'; // Yellow
          break;
        case Level.SHOUT:
        case Level.SEVERE:
          levelColor = '\x1B[31m'; // Red
          break;
        default:
          levelColor = '\x1B[34m'; // Blue
      }

      buffer.writeRaw(levelColor);
      buffer.writeRaw('[${context.level.name.toLowerCase()}]');
      buffer.writeRaw('\x1B[0m');

      if (context.scope.isNotEmpty) {
        buffer.writeRaw(' [${context.scope}]');
      }

      buffer.writeRaw(' ${context.message}');

      if (context.throwable != null || context.stackTrace != null) {
        buffer.newLine();
        buffer.indent();
        if (context.throwable != null) {
          if (context.throwable is Exception) {
            buffer.writeBlock(
              '\x1B[31mException: ${context.throwable}\x1B[0m',
            );
          } else {
            buffer.writeBlock('\x1B[31mError: ${context.throwable}\x1B[0m');
          }
        }
        if (context.stackTrace != null) {
          buffer.writeLine('StackTrace:');
          buffer.writeBlock(Trace.from(context.stackTrace!).terse.toString());
        }
        buffer.outdent();
      }
      return buffer.toString();
    };