npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

morgan-body

v2.6.9

Published

morgan logging req, res, and body

Downloads

82,129

Readme

morgan-body

So frequently in Dexter and the "morgan" library, we are left wondering, where's the body?

Well, we've found it! (for "morgan" library, not the show :P)

Here is logging the way you always wanted it to be! Nicely colorized logging that includes Request and Response bodies.

(Now with Typescript support thanks to @francisbrito)

NPM

Example Use

Note: unlike typical express middleware you must pass the actual app into the function

import morganBody from 'morgan-body';
import express from 'express';
import bodyParser from 'body-parser';

const app = express();

// must parse body before morganBody as body will be logged
app.use(bodyParser.json());

// hook morganBody to express app
morganBody(app);

Please make sure to call morganBody before registering routers (but after registering body-parser), because otherwise they wouldn't be logged.

More Usages

Log to file

In order to do that, you just need to pass a stream into the stream property in options. Example:

const log = fs.createWriteStream(
  path.join(__dirname, "logs", "express.log"), { flags: "a" }
);

morganBody(app, {
  // .. other settings
  noColors: true,
  stream: log,
});

If your log files look like this:

You just need disable the colors with the noColors property in options.

Multiple instances of MorganBody

If you want to use morganBody to log on multiple places, it can be done by just calling the function multiple times. As shown in the previous example, you can log to write streams. But what if you want to log to console as well? Easy.

// ... express

const log = fs.createWriteStream(
  path.join(__dirname, "logs", "express.log"), { flags: "a" }
);

morganBody(app, {
  // .. other settings
});

morganBody(app, {
  // .. other settings
  noColors: true,
  stream: log,
});

Using different loggers

What if you use a different logging library to log all your important information about what's happening with your application? You can use MorganBody with it as well!

Example with winston:

import winston from 'winston'

// ... express

const logger = winston.createLogger({
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({
      format: format.combine(format.timestamp(), loggerFormat),
      filename: path.join(__dirname, "../", "logs", "combined.log"),
    }),
  ],
});

const loggerStream = {
  write: message => {
    logger.info(message);
  },
};

morganBody(app, {
  // .. other settings
  stream: loggerStream
});

Execute code X on write

As you could've seen in the winston example, we don't even have a WriteStream here! You can just create an object with a write function inside it,and do whatever you want inside it!

const loggerStream = {
  write: message => {
    // do anything - emit to websocket? send message somewhere? log to cloud?
  },
};

morganBody(app, {
  // .. other settings
  stream: loggerStream
});

API

morganBody(<express instance>, <options object>)

Options are:

{
  noColors: (default: false), gets rid of colors in logs, while they're awesome, they don't look so good in log files as @rserentill pointed out

  maxBodyLength: (default: 1000), caps the length of the console output of a single request/response to specified length,

  prettify: (default: true), prettifies the JSON request/response body (may want to turn off for server logs),

  includeNewLine: (default: true), adds new line after each log entry (a common use case for making this `false` is if `prettify` is false).

  logReqDateTime: (default: true), setting to false disables logging request date + time,

  dateTimeFormat: (default: 'utc', available: ['edt', clf', 'iso', 'utc']), lets you specify dateTime format logged if "logDateTime" option is true (otherwise dateTime not logged anyways)

  timezone: (default : server's local timezone), time will be logged in the specified timezone. e.g. "EST", "America/Los_Angeles", "Asia/Kolkata" (for Indian Standard Time), etc. Internally uses "momentjs" for interpreting the timezone, and if specified value is not understood by momentjs, falls back to using the local timezone. (Please have a look at the TZ column here for a lit of supported timezone strings: https://wikipedia.org/wiki/List_of_tz_database_time_zones#List).

  logReqUserAgent: (default: true), setting to false disables logging request user agent,

  logRequestBody: (default: true), setting to false disables logging request body,

  logReqHeaderList: (default: false), takes in a list of request headers to be displayed in the log.

  logAllReqHeader: (default: false), true will log All request headers and take precedence over logReqHeaderList; false otherwise.

  logResponseBody: (default: true), setting to false disables logging response body,

  logRequestId: (default: false), setting to true will log "req.id" at the beginning of each line (must be setting req.id elsewhere upstream),

  logIP: (default: true), setting to true will log request IP,

  logResHeaderList: (default: false), takes in a list of response headers to be displayed in the log.

  logAllResHeader: (default: false), true will log All response headers and take precedence over logResHeaderList; false otherwise.

  skip: (default: null), optionally provide function of the signature "(req, res) => <bool>" to conditionally skip logging of requests (if provided function returns true),

  stream: (default: null), optionally provide a stream (or any object of the shape { write: <Function> }) to be used instead of "process.stdout" for logging to,

  theme: (default: 'defaultTheme'), alter the color scheme of your logger with a theme, see available themes below

  filterParameters: (default: []), set the properties you don't want to be shown, such as passwords or credit card numbers

  immediateReqLog: (default: true), logs request immediately (instead of waiting until response goes out)
}

Available Themes

Can be passed in as "theme" option, screenshots taken in iTerm2 (note that some text is not visible in some screenshots, this is because this text is colored non-intense black, it would show up on white-background terminals).

defaultTheme

dracula

usa

inverted

reverse ASCII color of default

darkened

no white (all colors rotated one away from white)

lightened

no black (all colors rotated one away from black)

dimmed

only non-"intense" colors