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.
Top comments (38)
Before I proceed I must warn you I am the author of the logging library I am using, so there is a tiny possibility that I might be biased. Very tiny :)
ulog - The microscopically small universal logger
Basically ulog is debug meets loglevel meets the console. It works in Node JS and all major browsers (even old ones!)
Why I built it
It started out because using console directly is basically VERBOTEN. Because some browsers simply don't support it and will crash your code. Also you need to remove these statements afterwards etc. Making logging difficult and error prone. So it started as a tiny shim that just makes sure that your code never crashes or fails whether console is available or not.
I then decided I wanted log level support so I added that. And then I discovered debug, which is GREAT, and I decided to copy those features I loved about that.
Why I think it is one of the best loggers
Example usage
Yields (on browsers)
If you want to try it
Now is the perfect time as I am trying to perfect v2 currently. So if you want to try this, please install the beta and let me know:
Or you can use v1, but that version is more limited in features:
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.
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.
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.
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
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.
this is awesome :)
chalk is great.
I also do this. But I’m curious about other answers in the thread.
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:
However, this means testing
log
before each call tolog.info
... You could maybe do this to prevent that test: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.
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.
I'am using log4js in my project. But most of time I still using console.log() for debugging
I like using this, too. Log levels are super helpful
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. hahahaconsole.log
andnode 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.I love
It is great but not very well supported I think? Does this work in Edge? Firefox?