logger function

Middleware logger([
  1. PrintFn? fn
])

HTTP request/response logger middleware, modeled after HonoJS.

Prints an incoming line before the handler and an outgoing line with a colored status code and elapsed time after it. Uses xxx as prefix when the handler throws.

Respects the NO_COLOR environment variable (https://no-color.org).

app.use(logger());

Output:

--> GET /users
<-- GET /users 200 4ms

Custom printer:

app.use(logger((msg, [_]) => myLogSystem.info(msg)));

Implementation

Middleware logger([PrintFn? fn]) {
  final log = fn ?? _defaultPrint;

  return (Context c, Next next) async {
    final method = c.req.method;
    final path = c.req.path;

    _emit(log, _Prefix.incoming, method, path);

    final start = DateTime.now();

    try {
      await next();
    } catch (_) {
      _emit(log, _Prefix.error, method, path);
      rethrow;
    }

    _emit(
      log,
      _Prefix.outgoing,
      method,
      path,
      status: c.statusCode,
      elapsed: _elapsed(start),
    );
  };
}