Bird
Raised Fist0
NestJSframework~5 mins

Logging with Winston or Pino in NestJS - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the main purpose of using Winston or Pino in a NestJS application?
Winston and Pino are logging libraries used to record application events, errors, and other important information to help developers monitor and debug the application.
Click to reveal answer
intermediate
How does Pino differ from Winston in terms of performance?
Pino is designed to be very fast and efficient with low overhead, making it suitable for high-performance applications, while Winston offers more features but with slightly more overhead.
Click to reveal answer
intermediate
In NestJS, how do you integrate Winston as the main logger?
You create a Winston logger instance and then provide it to NestJS using the LoggerModule or by overriding the default logger with a custom provider.
Click to reveal answer
beginner
What is a common format used by Pino for log output?
Pino outputs logs in JSON format by default, which makes it easy to parse and analyze logs with other tools.
Click to reveal answer
beginner
Why is structured logging important in modern applications?
Structured logging, like JSON logs from Pino or Winston, helps machines and humans easily search, filter, and analyze logs, improving debugging and monitoring.
Click to reveal answer
Which logging library is known for its high performance and low overhead?
APino
BWinston
CMorgan
DBunyan
What format does Pino use by default for its logs?
AXML
BJSON
CPlain text
DYAML
In NestJS, how can you replace the default logger with Winston?
ABy using console.log directly
BBy importing Morgan middleware
CBy installing Pino only
DBy creating a custom provider with Winston logger
Which of the following is NOT a benefit of structured logging?
AEasier log filtering
BSimplified debugging
CBetter human readability without tools
DImproved machine parsing
Which library provides more built-in features but with slightly more overhead?
AWinston
BPino
CConsole
DDebug
Explain how you would set up Pino logging in a NestJS application.
Think about installation, creation, integration, and usage steps.
You got /4 concepts.
    Describe the advantages of using structured logging with Winston or Pino.
    Focus on how structured logs help both humans and tools.
    You got /4 concepts.

      Practice

      (1/5)
      1.

      What is the main purpose of using Winston or Pino in a NestJS application?

      easy
      A. To handle HTTP requests and responses
      B. To log application events and errors for monitoring and debugging
      C. To manage database connections efficiently
      D. To compile TypeScript code into JavaScript

      Solution

      1. Step 1: Understand logging role

        Logging tools like Winston or Pino record app events and errors to help developers monitor and debug the app.
      2. Step 2: Identify unrelated options

        Database management, HTTP handling, and code compilation are unrelated to logging.
      3. Final Answer:

        To log application events and errors for monitoring and debugging -> Option B
      4. Quick Check:

        Logging = Monitoring and debugging [OK]
      Hint: Logging tools track app events and errors [OK]
      Common Mistakes:
      • Confusing logging with database or HTTP handling
      • Thinking logging compiles code
      • Assuming logging manages app logic
      2.

      Which of the following is the correct way to import and use Logger from @nestjs/common for basic logging?

      ?
      easy
      A. import { Logger } from '@nestjs/common'; const logger = new Logger('App'); logger.log('App started');
      B. import Logger from 'nestjs'; const logger = Logger(); logger.log('App started');
      C. const Logger = require('@nestjs/common'); const logger = new Logger(); logger.info('App started');
      D. import { Logger } from 'winston'; const logger = new Logger(); logger.log('App started');

      Solution

      1. Step 1: Check correct import syntax

        Correct import is from '@nestjs/common' using named import: import { Logger } from '@nestjs/common';
      2. Step 2: Verify usage

        Logger is instantiated with a context string, then log method is called. import { Logger } from '@nestjs/common'; const logger = new Logger('App'); logger.log('App started'); matches this.
      3. Final Answer:

        import { Logger } from '@nestjs/common'; const logger = new Logger('App'); logger.log('App started'); -> Option A
      4. Quick Check:

        Correct import and usage = import { Logger } from '@nestjs/common'; const logger = new Logger('App'); logger.log('App started'); [OK]
      Hint: Use named import from '@nestjs/common' for Logger [OK]
      Common Mistakes:
      • Using default import instead of named import
      • Calling wrong method like info instead of log
      • Importing Logger from wrong package
      3.

      Given this NestJS code using Pino logger, what will be the output in the console?

      import { Logger } from 'nestjs-pino';
      const logger = new Logger();
      logger.info('Server started');
      logger.error('Failed to connect');
      medium
      A. {"level":30,"msg":"Server started"} followed by {"level":50,"msg":"Failed to connect"}
      B. Plain text logs: 'Server started' and 'Failed to connect' without JSON
      C. SyntaxError due to missing import from '@nestjs/common'
      D. No output because logger is not instantiated correctly

      Solution

      1. Step 1: Understand Pino output format

        Pino logs output JSON strings with level numbers (30=info, 50=error) and message keys.
      2. Step 2: Analyze code behavior

        Logger instance calls info and error methods, producing JSON logs with messages.
      3. Final Answer:

        {"level":30,"msg":"Server started"} followed by {"level":50,"msg":"Failed to connect"} -> Option A
      4. Quick Check:

        Pino logs JSON with level and msg [OK]
      Hint: Pino logs JSON with level numbers and message keys [OK]
      Common Mistakes:
      • Expecting plain text logs instead of JSON
      • Confusing Pino with NestJS Logger
      • Assuming no output due to import confusion
      4.

      Identify the error in this NestJS Winston logger setup:

      import { WinstonModule } from 'nest-winston';
      import * as winston from 'winston';
      
      const logger = WinstonModule.forRoot({
        transports: [
          new winston.transports.Console({ level: 'info' })
        ]
      });
      
      logger.error('Error occurred');
      medium
      A. Incorrect transport name; should be winston.Console instead of winston.transports.Console
      B. Missing import of Logger from '@nestjs/common'
      C. The logger instance does not have an error method directly; it returns a module, not a logger
      D. Level 'info' is invalid for Console transport

      Solution

      1. Step 1: Understand WinstonModule.forRoot return

        This method returns a NestJS module, not a direct logger instance with methods like error.
      2. Step 2: Identify correct usage

        To log, you must inject the logger service or use winston.createLogger directly, not call error on the module.
      3. Final Answer:

        The logger instance does not have an error method directly; it returns a module, not a logger -> Option C
      4. Quick Check:

        WinstonModule.forRoot returns module, not logger instance [OK]
      Hint: WinstonModule.forRoot returns module, not logger instance [OK]
      Common Mistakes:
      • Calling error method on module instead of logger instance
      • Confusing transport names
      • Assuming level 'info' is invalid
      5.

      You want to configure NestJS to use Pino for logging with JSON output and also log HTTP requests. Which setup is correct?

      ?
      hard
      A. import * as pino from 'pino'; const logger = pino({ prettyPrint: true }); logger.info('HTTP request logged');
      B. import { WinstonModule } from 'nest-winston'; WinstonModule.forRoot({ transports: [new winston.transports.File({ filename: 'log.json' })] });
      C. import { Logger } from '@nestjs/common'; const logger = new Logger(); logger.log('HTTP request logged');
      D. import { LoggerModule } from 'nestjs-pino'; LoggerModule.forRoot({ pinoHttp: { level: 'info' } });

      Solution

      1. Step 1: Identify Pino module usage in NestJS

        Use LoggerModule from 'nestjs-pino' with forRoot and pinoHttp config for HTTP logging and JSON output.
      2. Step 2: Check options for JSON and pretty printing

        import { LoggerModule } from 'nestjs-pino'; LoggerModule.forRoot({ pinoHttp: { level: 'info' } }); configures nestjs-pino LoggerModule with pinoHttp for HTTP request logging at info level, producing JSON output by default, matching requirements.
      3. Final Answer:

        import { LoggerModule } from 'nestjs-pino'; LoggerModule.forRoot({ pinoHttp: { level: 'info' } }); -> Option D
      4. Quick Check:

        nestjs-pino with pinoHttp config = import { LoggerModule } from 'nestjs-pino'; LoggerModule.forRoot({ pinoHttp: { level: 'info' } }); [OK]
      Hint: Use nestjs-pino LoggerModule with pinoHttp config for HTTP logs [OK]
      Common Mistakes:
      • Using WinstonModule instead of nestjs-pino for Pino logging
      • Using Logger from '@nestjs/common' for HTTP logs
      • Using pino directly without NestJS integration
      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