DEV Community

Cover image for What JS Logging library / tool do you use?
Daniel Golant
Daniel Golant

Posted on

What JS Logging library / tool do you use?

I am trying to decide on what logging module to try out for my next project. I'd love the dev community's input on:

A) What logging lib you use
B) Whether you structure your logs (and how)
C) Where you store your logs or any other logging infra you have

I have been using Winston, but I would like something that supports structured logging out of the box. The general ecosystem on NPM seems to be pretty split, and some options seem to be popular but un-maintained.

Oldest comments (38)

Collapse
 
tux0r profile image
tux0r • Edited

There is only one thing I use:

console.log()

And I reset (and remove) my logs after the code has been proven stable. :-) Generally, logging should remain a debugging feature. The users won't need it.

Collapse
 
ben profile image
Ben Halpern

I also do this. But I’m curious about other answers in the thread.

Collapse
 
leoat12 profile image
Leonardo Teteo

Since I'm just starting learning node I came to this post with some hesitation since I really didn't know if console.log() was an acceptable answer. Thanks for the clarification. hahaha

Collapse
 
download profile image
Stijn de Witt

The problem with using console directly is that there are browsers out there (probably only real old ones though) that simply crash your code right away because console is undefined when the developer tool is not opened. Also some interpreters, such as Nashorn which comes with Java, simply do not have a console defined.

If you want to avert that risk and still only use the console for logging, you should write code similar to this:

var log = (typeof console != 'undefined') && console 
// Testing with typeof is better than window.console 
// since it works everywhere, inclucing Node JS / Nashorn
log && log.info('If the console is not there, this code will not crash')

However, this means testing log before each call to log.info... You could maybe do this to prevent that test:

var log = typeof console != 'undefined' ? console : {info:function(){}}
log.info('This code calls a dummy function if console is not there')

However, you would also have to make dummies for warn(), error() etc... In the end you would be building a shim... Which is exactly how ulog started. I understand your desire to keep logging simple and not use any external libs for it... But really the state of JS today is that 'simple' logging either is broken (crashes on some systems), is not actually 'simple' (see code examples above), or does use a library. I built ulog from the desire to make it as close to using no lib at all, while actually solving those problems. If you never use any logging lib, ulog was built with you in mind! Please try it and let me know.

Collapse
 
dyllanwli profile image
dyllanwx

I'am using log4js in my project. But most of time I still using console.log() for debugging

Collapse
 
offendingcommit profile image
Jonathan Irvin

I like using this, too. Log levels are super helpful

Collapse
 
revskill10 profile image
Truong Hoang Dung

What will be the API you want for the logger ?

Collapse
 
mandava profile image
BM

We are using loglevel github.com/pimterry/loglevel to log errors and to debug code. Currently not storing the logs. All the "debug" logs are disabled in production builds.

Collapse
 
mattisaemi profile image
Matti Saemi

my use cases :

1- in case of using Docker
A) Winston to log and store in txt file
B) structure based on the Service name, and Environment (stg or production)
C) Store in txt file, use filebeat to harvest and push to Logstash to index and store in Elastic search. then visualise it Kibana (ELK stack)

2- in case of using AWS Lambda
A) simple "console.log()"
B) not really
C) just use AWS CloudWatch

Collapse
 
janguianof profile image
Jaime Anguiano • Edited

take a look at this:

github.com/pinojs/pino

hope it helps!

Collapse
 
shicongbuct profile image
shicong

I use log4js or bunyan.

Collapse
 
avalander profile image
Avalander

console.log and node app.js > app.log work fine most of the time.

Sometimes, if I need to filter logs and stuff, I write them as json objects instead of plain files and create a very simple wrapper over console.log, but I've never had the need to do anything very elaborated.

Collapse
 
tedhagos profile image
Ted Hagos

like you, I've been using Winston (am still using it)

Collapse
 
chrisme profile image
Chris

Winston, logging to console in development and console plus elastic stack in production.

I like the feature of sending JSON to elastic with the resulting possibility of organizing (filtering, sorting, searching, columns, ...) based on those JSON keys.

Collapse
 
acanimal profile image
Antonio Santiago

I used winston, bunyan and pino (also console.log 😅) on nodejs apps to log all application activity and storing using some "log rotate" plugin.

Collapse
 
janguianof profile image
Jaime Anguiano

same here! winston, bunyan and pino for da win!

Collapse
 
ccleary00 profile image
Corey Cleary

I've written two posts on logging in JavaScript that might be helpful:
Should you use a logging framework or console.log() in Node?

^ In this one I make the argument that often console.log() and console.error() are enough to get the job done, unless you have a use case for custom log levels, for writing to different outputs/locations (I recommended against doing this), or need the ability to toggle logs on and off.

If I do have that use case I use Winston as it's pretty well supported.

Why should your Node.js application not handle log routing?

^ this one hopefully helps answer your question about storing logs and logging infrastructure

I always write to stdout/stderr (the console module writes here) as it's really easy for Docker or other containers to pick up the logs from there and route them wherever you need to (Splunk, a database, etc.).

In a container/distributed/cloud environment it becomes much easier to manage the logs and adheres to the 12 Factor best practices for logging.

In this way, the log routing is decoupled from the concerns of the application. All the application then cares about is writing to console, and infrastructure-wise, the container picks up the logs and takes care of them from there.

Collapse
 
qm3ster profile image
Mihail Malo

I don't have console.alert. Did you mean .assert?

Collapse
 
pldg profile image
Luca

For those who use simple console.log() and VS Code as editor, try out wrap-console-log extension.

If you'd like to color your log try chalk.

Collapse
 
dangolant profile image
Daniel Golant

this is awesome :)

Collapse
 
hdennen profile image
Harry Dennen

chalk is great.

Collapse
 
pim profile image
Pim

Seems like a lot of people use winston. I primarily use serilog (.NET), the reason I love it and bring it up is because it's a fully-structured logger. I can't speak to winston's capabilities, but I know bunyan offers similar features in node which I highly recommend finding.

Collapse
 
entrptaher profile image
Md Abu Taher • Edited

Other than console.log(), there have been morgan, winston, pino and at least hundreds of others.

But, I am very surprised to see no one mentioned debug, it has 22,914,644 weekly downloads as of right this comment.

  • I can filter out and specify different keywords I put beforehand, can use wildcards for multiple keywords/namespace
  • Can have namespace colors
  • Even works on web browser with colorized output
  • can show ms diff between last msg
  • ...lots of other cool features like streams and the list goes on
  • and most importantly it is actively developed

Though it is more of a debugging tool than a logging tool, we do have to log a lot while trying to debug, or in most case debugging is the only goal for logging.

There are obvious gotchas, but who cares as long as I can get to see what I wanted to see.

Collapse
 
d0ruk profile image
Doruk Kutlu

debug module borks when minimized

You need to configure the compression to let some optimizations through

I also couldnt get it to work on an isomorphic app. Minimizing for node.js and tje web require 2 different approaches

Collapse
 
download profile image
Stijn de Witt

Indeed, debug RULES! So much so I rebuilt my logging lib from scratch so it could incorporate debug's best features.

The biggest gripe I have with it is that it is not full-featured. It basically is ONLY for debug logging. I like to log some info/warning messages as well some times. With debug you still need either a different lib or the console just for that.