📖 Scenario: You are building a simple Express.js server. You want to add logging to track requests and errors clearly. Using Winston, a popular logging library, will help you keep logs organized and easy to read.
🎯 Goal: Set up Winston logging in an Express.js app to log messages of different levels and print a test log message.
📋 What You'll Learn
Create a Winston logger with Console transport
Set the log level to 'info'
Log a test message using the logger
💡 Why This Matters
🌍 Real World
Logging helps developers track what happens in their apps. Winston is a popular tool to organize logs by level and destination.
💼 Career
Knowing how to set up logging with Winston is a key skill for backend developers and DevOps engineers to monitor and debug applications.
Progress0 / 4 steps
1
Setup Express app and import Winston
Create a new Express app by importing express and winston. Then create an Express app instance called app.
Express
Hint
Use require('express') and require('winston') to import the modules. Then call express() to create the app.
2
Create a Winston logger with Console transport
Create a Winston logger called logger using winston.createLogger. Add a Console transport with log level set to 'info'.
Express
Hint
Use winston.createLogger with an object that has level: 'info' and a transports array containing new winston.transports.Console().
3
Log a test info message
Use the logger to log an info message with the text 'Server started successfully'.
Express
Hint
Call logger.info with the string 'Server started successfully'.
4
Print the log output by running the app
Run the app and observe the console output. Use console.log to print 'Logging test complete' after the log message.
Express
Hint
Use console.log('Logging test complete') to print the final message.
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
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.
Step 2: Compare with other options
Handling HTTP, database connections, or UI styling are not related to logging.
Final Answer:
To save and manage logs about the app's actions and errors -> Option B
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
Step 1: Recall Winston logger creation syntax
Winston uses createLogger with a transports array specifying where to send logs.
Step 2: Identify correct transport usage
Using new winston.transports.Console() inside transports array is the correct way.
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
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'.
Step 2: Verify other options
Console transport is valid; no start() method exists; logger is declared correctly.
Final Answer:
The default log level is 'info', so 'debug' messages are ignored -> Option A
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
Step 1: Understand transport level filtering
To log errors to file only, set level: 'error' on File transport.
Step 2: Ensure console logs all levels
Console transport without level logs all messages by default.
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.
Final Answer:
const logger = winston.createLogger({ transports: [new winston.transports.Console(), new winston.transports.File({ filename: 'error.log', level: 'error' })] }); -> Option A
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 unknownstrongwhile earning +1 Grip toward your certificate.