mac- / hapi-logger

A Hapi plugin for writing logs via bunyan
MIT License
5 stars 5 forks source link

hapi-logger

Build Status Coverage Status Code Climate NPM version Dependency Status

NPM

A Hapi plugin for writing logs to stdout via bunyan

Bunyan is a great module for logging, but I like the flexibility that having tagged log messages gives me over your traditional log levels. Luckily Hapi already emits log events with tags, so we can add those tags to our log message. The current implementation of this module logs every message as "info" as far as bunyan is concerned, so you might as well ignore the "level" property on the log message. However, all the tags are included on the message, which should give enough context about the message.

Contributing

This module makes use of a Makefile for building/testing purposes. After obtaining a copy of the repo, run the following commands to make sure everything is in working condition before you start your work:

make install
make test

Before committing a change to your fork/branch, run the following commands to make sure nothing is broken:

make test
make test-cov

Don't forget to bump the version in the package.json using the semver spec as a guide for which part to bump. Submit a pull request when your work is complete.

Notes:

Installation

npm install hapi-logger

Usage

To install this plugin on your Hapi server, do something similar to this:

var Hapi = require('hapi');
var server = new Hapi.Server();

var hapiLoggerConfig = {};

server.register({ register: require('hapi-logger'), options: hapiLoggerConfig }, function(err) {
    if (err) {
        console.log('error', 'Failed loading plugin: hapi-logger');
    }
});

Plugin Options

name

The name of your application, or any other name you wish to have contained within your log message, for this pack of servers. Defaults to 'hapi-logger'

src

A flag that tells bunyan whether or not to include the location from where the log message originiated. Don't set this to true in production! Defaults to false

tags

The tags used to determine when a log message is logged. This value can contain both strings and arrays of strings. The items in the top level of the collection are OR'd, while any items in nested arrays are AND'd.

If the collection includes '*' then all messages will be logged. Defaults to ['*']

Examples

  1. Top-level strings only:
[
    'error',
    'info'
]

Means that log messages with either the tag 'error' OR 'info' will get logged.

  1. Nested strings only:
[
    [
        'error',
        'request'
    ]
]

Means that log messages with the tags 'error' AND 'request' will get logged.

  1. Top-level and nested strings:
[
    'info',
    [
        'error',
        'request'
    ]
]

Means that log messages with either the tag 'info' OR the tags 'error' AND 'request' will get logged.

ignoredTags

The tags used to determine when a log message is NOT logged. This value can contain both strings and arrays of strings. The items in the top level of the collection are OR'd, while any items in nested arrays are AND'd.

If the collection includes '*' then no messages will be logged. Defaults to []

Note: If a log message matches any of these tags, it will not be logged, even if it would have been because it matched values in tags.

Examples

  1. Top-level strings only:
[
    'error',
    'info'
]

Means that log messages with either the tag 'error' OR 'info' will not get logged.

  1. Nested strings only:
[
    [
        'error',
        'request'
    ]
]

Means that log messages with the tags 'error' AND 'request' will not get logged.

  1. Top-level and nested strings:
[
    'info',
    [
        'error',
        'request'
    ]
]

Means that log messages with either the tag 'info' OR the tags 'error' AND 'request' will not get logged.

shouldLog

A function that will receive the log data as a parameter and should return true if the message should be logged, or false if the message should not be logged. The tags and ignoredTags are evaulated first then this function will be executed. Defaults to null

Example

A Hapi route configured like this:

server.route({
    method: 'GET',
    path: '/test/{param}',
    handler: function(request, reply) {
        request.log(['get', 'testResource'], 'Some important info...');
        reply('Success!');
    }
});

would cause the following log message to be written (in addition to any other internal Hapi-related events) when a request is issued to the route:

{"name":"hapi-logger","hostname":"Me","pid":54705,"level":30,"tags":["get","testResource"],"req":{"id":"1408481983531-54705-47711","headers":{"user-agent":"curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8x zlib/1.2.5","host":"localhost:8080","accept":"*/*"},"method":"get","info":{"received":1408481983531,"remoteAddress":"127.0.0.1","remotePort":63014,"referrer":"","host":"localhost:8080"},"path":"/test/1234"},"msg":"Some important info...","time":"2014-08-19T20:59:43.542Z","v":0}

In addition to user-initiated request log events, this module will also listen for server log events, request events, and internalError events, and log those if not filtered by the configured tags or ignoredTags.

To provide a little more context about a log message, you can log messages like so:

server.log(['mytag'], { message: 'My log message', other: 'Some other data' });

By passing an object as the second paramter, you can pass along context with your message. If no message is detected a default message will be used. Here are the default messages for the corresponding Hapi events:

If an internalError event is received, then the log message will be the error message.

Version Compatibility

Currently compatible with: Hapi 16.x.x

License

The MIT License (MIT)