Bird
Raised Fist0
Expressframework~5 mins

Winston for application logging in Express

Choose your learning style10 modes available
Introduction

Winston helps you keep track of what your app is doing by saving messages about events. This makes it easier to find and fix problems.

You want to record errors happening in your app to fix them later.
You need to save info about user actions for security or analysis.
You want to keep logs in files instead of just showing them on the screen.
You want to separate logs by importance, like errors vs. normal info.
You want to send logs to different places, like files and the console.
Syntax
Express
const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: 'app.log' })
  ]
});

logger.info('Message here');

level sets the minimum importance of messages to save.

transports are where logs go, like console or files.

Examples
This example logs only error messages to the console.
Express
const logger = winston.createLogger({
  level: 'error',
  transports: [new winston.transports.Console()]
});

logger.error('This is an error message');
This example saves info messages in a simple text format to a file.
Express
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.simple(),
  transports: [
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

logger.info('App started');
This example shows colored debug messages in the console for easier reading.
Express
const logger = winston.createLogger({
  level: 'debug',
  format: winston.format.combine(
    winston.format.colorize(),
    winston.format.simple()
  ),
  transports: [new winston.transports.Console()]
});

logger.debug('Debugging info');
Sample Program

This Express app uses Winston to log when the server starts and when someone visits the home page. Logs go to both the console and a file named app.log.

Express
const express = require('express');
const winston = require('winston');

const app = express();

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: 'app.log' })
  ]
});

app.get('/', (req, res) => {
  logger.info('Home page was visited');
  res.send('Hello World!');
});

app.listen(3000, () => {
  logger.info('Server started on port 3000');
});
OutputSuccess
Important Notes

Winston timestamps logs automatically if you add the timestamp format.

You can add more transports to send logs to places like remote servers.

Use different log levels to control what messages get saved.

Summary

Winston helps save messages about your app's actions and errors.

You can send logs to the console, files, or other places.

Setting log levels helps you focus on important messages.

Practice

(1/5)
1. What is the main purpose of using Winston in an Express application?
easy
A. To connect the app to a database
B. To save and manage logs about the app's actions and errors
C. To handle HTTP requests and responses
D. To style the user interface

Solution

  1. Step 1: Understand Winston's role

    Winston is a logging library used to record messages about what the app is doing or errors it encounters.
  2. Step 2: Compare with other options

    Handling HTTP, database connections, or UI styling are not related to logging.
  3. Final Answer:

    To save and manage logs about the app's actions and errors -> Option B
  4. Quick Check:

    Winston logs app events = C [OK]
Hint: Winston is for logging, not for handling requests or UI [OK]
Common Mistakes:
  • Confusing logging with request handling
  • Thinking Winston manages databases
  • Assuming Winston styles the app
2. Which of the following is the correct way to create a Winston logger that logs to the console?
easy
A. const logger = winston.logToConsole();
B. const logger = winston.createLogger(console);
C. const logger = winston.createLogger({ transports: [new winston.transports.Console()] });
D. const logger = new winston.ConsoleLogger();

Solution

  1. Step 1: Recall Winston logger creation syntax

    Winston uses createLogger with a transports array specifying where to send logs.
  2. Step 2: Identify correct transport usage

    Using new winston.transports.Console() inside transports array is the correct way.
  3. Final Answer:

    const logger = winston.createLogger({ transports: [new winston.transports.Console()] }); -> Option C
  4. Quick Check:

    Logger with Console transport = D [OK]
Hint: Use createLogger with transports array for console logging [OK]
Common Mistakes:
  • Passing console directly instead of transport object
  • Using non-existent Winston methods
  • Incorrect instantiation of logger
3. Given the following code snippet, what will be the output in the console?
const winston = require('winston');
const logger = winston.createLogger({
  level: 'warn',
  transports: [new winston.transports.Console()]
});
logger.info('Info message');
logger.warn('Warning message');
logger.error('Error message');
medium
A. [Info message]
B. [Info message]\n[Warning message]\n[Error message]
C. [Error message]
D. [Warning message]\n[Error message]

Solution

  1. Step 1: Understand log level filtering

    The logger level is set to 'warn', so it logs messages with level 'warn' and higher (warn, error).
  2. Step 2: Check which messages are logged

    'info' is below 'warn' so it is ignored; 'warn' and 'error' messages appear in console.
  3. Final Answer:

    [Warning message]\n[Error message] -> Option D
  4. Quick Check:

    Level 'warn' logs warn and error only = A [OK]
Hint: Logger level filters out lower priority messages [OK]
Common Mistakes:
  • Expecting info messages to appear at warn level
  • Confusing log levels order
  • Ignoring that error is higher than warn
4. You wrote this Winston logger setup but no logs appear in the console:
const logger = winston.createLogger({
  transports: [new winston.transports.Console()]
});
logger.debug('Test log');
What is the most likely reason?
medium
A. The default log level is 'info', so 'debug' messages are ignored
B. Console transport is not supported in Winston
C. You must call logger.start() before logging
D. The logger variable is not declared properly

Solution

  1. Step 1: Check default log level behavior

    Winston's default log level is 'info', which logs 'info' and higher severity levels ('warn', 'error'), ignoring lower levels like 'debug'.
  2. Step 2: Verify other options

    Console transport is valid; no start() method exists; logger is declared correctly.
  3. Final Answer:

    The default log level is 'info', so 'debug' messages are ignored -> Option A
  4. Quick Check:

    Default level blocks lower logs = A [OK]
Hint: Set log level to 'debug' to see debug logs [OK]
Common Mistakes:
  • Assuming console transport is invalid
  • Looking for non-existent start method
  • Ignoring default log level filtering
5. You want to log errors to a file named 'error.log' and all logs to the console in an Express app using Winston. Which configuration correctly achieves this?
hard
A. const logger = winston.createLogger({ transports: [new winston.transports.Console(), new winston.transports.File({ filename: 'error.log', level: 'error' })] });
B. const logger = winston.createLogger({ transports: [new winston.transports.File({ filename: 'error.log' }), new winston.transports.Console({ level: 'error' })] });
C. const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'error' }), new winston.transports.File({ filename: 'error.log' })] });
D. const logger = winston.createLogger({ transports: [new winston.transports.File({ filename: 'error.log', level: 'info' }), new winston.transports.Console()] });

Solution

  1. Step 1: Understand transport level filtering

    To log errors to file only, set level: 'error' on File transport.
  2. Step 2: Ensure console logs all levels

    Console transport without level logs all messages by default.
  3. Step 3: Check options

    const logger = winston.createLogger({ transports: [new winston.transports.Console(), new winston.transports.File({ filename: 'error.log', level: 'error' })] }); matches this setup: Console logs all, File logs errors only.
  4. Final Answer:

    const logger = winston.createLogger({ transports: [new winston.transports.Console(), new winston.transports.File({ filename: 'error.log', level: 'error' })] }); -> Option A
  5. Quick Check:

    File logs errors, console logs all = B [OK]
Hint: Set level on file transport only to filter errors [OK]
Common Mistakes:
  • Setting wrong levels on transports
  • Reversing console and file roles
  • Omitting filename or level in file transport
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard