Falcon 2019 is now deprecated. If you have an existing Falcon 2019 project we are still commited to support you. Please get in touch for more information.
Version: current

Falcon Logger

Utility tool used for logging in Falcon packages, but can also be used for logging in your custom Node.js apps.

Installation

npm install @deity/falcon-logger
yarn add @deity/falcon-logger

Falcon-Logger uses pino library under the hood to work with log messages.

Basic Usage

The package exports a singleton Logger object that exposes logging and configuration methods. By default log level is set to info. But if you do want to change it - you need to set a required log level for the logger instance and the sooner you do this after the initial import statement the better:

const Logger = require('@deity/falcon-logger');
Logger.setLogLevel('debug');
Logger.info('My log message');

Since you might be working with multiple apps - obviously you would like to be able to distinguish them apart in your logging system. In order to do that - there's a dedicated method for that:

const Logger = require('@deity/falcon-logger');
Logger.setApp('my-app');
Logger.info('My log message');

This will simply add "app": "my-app" data to every log message you send (not visible when using logger-pretty), so you'll be able to filter your log messages by this key:

<img alt={"DEITY Falcon Logger setApp"} src={require("!url-loader?limit=10000&name=assets/images/[name]-[hash].[ext]&fallback=file-loader!/opt/build/repo/static/img/opensource/logger-setapp.png").default} />

Setting LogLevel and App for Falcon-based apps is done automatically using the provided config values

getFor method

Falcon-Logger provides a handy getFor method to initialize an extra module key for log message. This way, you could easily define sub-loggers for your nested modules, for example:

const Logger = require('@deity/falcon-logger');
const subLogger = Logger.getFor('my-module');
subLogger.info('My log message');

This call will add "module": "my-module" data to every log entry you send via subLogger. In conjunction with logger-pretty - it will render an additional [my-module] section in the log message output:

<img alt={"DEITY Falcon Logger getFor"} src={require("!url-loader?limit=10000&name=assets/images/[name]-[hash].[ext]&fallback=file-loader!/opt/build/repo/static/img/opensource/logger-getfor.png").default} />

traceTime method

Another handy method is called traceTime. This method can be used to calculate the time that your callback needs to complete the execution. This method accepts 2 argument - label and fn:

const Logger = require('@deity/falcon-logger');
const result = await Logger.traceTime('My time', async() => { ... });

traceTime method will return the result of the execution of your callback. If your log level is set to trace - Logger will produce the following log message:

TRACE: My time (10ms)

Of course, (10ms) may vary depending on your code. If log level is set higher than trace - the calculations won't be performed, and the result will be returned right away.

The rest of the methods are available from the original Pino module.

Logger Pretty

@deity/falcon-logger package exposes a binary script called logger-pretty that provides a basic formatter for log entries. Best to use with Falcon-based apps in development mode.

logger-pretty script reuses code of pino-pretty module

Due to a nature of Pino logger - you can use this package as a part of pipelining (| logger-pretty) in your package.json file:

{
"scripts": {
"start": "cross-env NODE_ENV=development nodemon index.js | logger-pretty",
}
}

As a result, your console output should look similar to this:

<img alt={"DEITY Falcon Logger Pretty"} src={require("!url-loader?limit=10000&name=assets/images/[name]-[hash].[ext]&fallback=file-loader!/opt/build/repo/static/img/opensource/logger-pretty.png").default} />

This way, the formatting code offloads your application (which gives an extra performance boost) and handles it in a dedicated sub-process. It also gives you the ability to apply your own formatting without changing any internal code, you simply change the last part of the pipeline.

For production mode - you simply remove the last part of the pipeline and you will start seeing a raw JSON output:

<img alt={"DEITY Falcon Logger Raw"} src={require("!url-loader?limit=10000&name=assets/images/[name]-[hash].[ext]&fallback=file-loader!/opt/build/repo/static/img/opensource/logger-production.png").default} />

Logger-Pretty on production

Even though your application is running in production mode - it is still possible to use logger-pretty to format those log messages without a need to restart your application. All you need to do is to ensure @deity/falcon-logger is installed and then simply pass log entries to this script:

cat logs/app.log | ./node_modules/.bin/logger-pretty

When using PM2:

pm2 logs 0 --raw | ./node_modules/.bin/logger-pretty

Minimal mode

There's an extra mode included into logger-pretty - it's called minimal. To enable it - you need to pass an extra flag like logger-pretty -m. Best to use with Falcon-based apps when running falcon-scripts or falcon-client commands as it does not show a log level nor date time information in the output:

<img alt={"DEITY Falcon Logger Minimal"} src={require("!url-loader?limit=10000&name=assets/images/[name]-[hash].[ext]&fallback=file-loader!/opt/build/repo/static/img/opensource/logger-minimal.png").default} />

Transports

To get more information about Logger transports - please refer to this page.

Ask the community. #help

If you can't find what you're looking for, the answer might be on our community slack channel. Our team keep a close eye on this and will usually get back to you within a few hours, if not straight away. If you haven't created an account yet please sign up here slack.deity.io.