Пошук уроків, статей та іншого контенту
Додасте базове логування подій, рівні повідомлень і керування виведенням логів у production.
Логування — це запис повідомлень про роботу застосунку. Логи допомагають:
зрозуміти, які події відбуваються;
знайти причину помилки;
перевірити, чи виконується потрібний код;
контролювати роботу застосунку в production.
У NestJS є вбудований логер Logger. Він підтримує кілька рівнів повідомлень і не потребує встановлення додаткових пакетів.
LoggerІмпортуйте Logger з пакета @nestjs/common і створіть його екземпляр:
import { Injectable, Logger } from '@nestjs/common';
@Injectable()
export class UsersService {
private readonly logger = new Logger(UsersService.name);
findAll() {
this.logger.log('Отримання списку користувачів');
return [];
}
}UsersService.name використовується як контекст. У консолі буде зрозуміло, який саме клас створив повідомлення.
Приблизний результат:
[Nest] 12345 - 01.09.2026, 12:00:00 LOG [UsersService] Отримання списку користувачівВбудований логер NestJS має такі основні методи:
log() — звичайна інформаційна подія;
error() — помилка;
warn() — попередження;
debug() — діагностична інформація;
verbose() — детальна діагностична інформація;
fatal() — критична помилка.
log()Використовуйте log() для важливих звичайних подій:
this.logger.log('Користувача успішно створено');Не потрібно записувати кожну дрібну операцію через log(). Логи мають допомагати розуміти роботу застосунку, а не створювати зайвий шум.
error()error() призначений для помилок. Другим аргументом можна передати стек викликів:
try {
// Операція, яка може завершитися помилкою
} catch (error) {
this.logger.error('Не вдалося завантажити користувачів', error.stack);
}Стек викликів допомагає визначити місце, де виникла помилка.
Безпечніший варіант із перевіркою типу помилки:
try {
// Операція, яка може завершитися помилкою
} catch (error) {
const stack = error instanceof Error ? error.stack : undefined;
this.logger.error('Не вдалося виконати операцію', stack);
}warn()warn() використовується для підозрілих або небажаних ситуацій, які не зупиняють застосунок:
if (!user.email) {
this.logger.warn('Користувач не має електронної адреси');
}debug() і verbose()Ці рівні підходять для детальної діагностики:
this.logger.debug(`Пошук користувача з id: ${userId}`);
this.logger.verbose('Запущено перевірку доступу');Їх часто вмикають під час розробки, але вимикають у production, щоб не перевантажувати журнали.
Ось повний приклад сервісу з кількома рівнями логування:
import { Injectable, Logger } from '@nestjs/common';
@Injectable()
export class UsersService {
private readonly logger = new Logger(UsersService.name);
private readonly users = [
{ id: 1, name: 'Анна' },
{ id: 2, name: 'Олег' },
];
findAll() {
this.logger.log('Запит на отримання всіх користувачів');
this.logger.debug(`Кількість користувачів: ${this.users.length}`);
return this.users;
}
findOne(id: number) {
this.logger.debug(`Пошук користувача з id: ${id}`);
const user = this.users.find((item) => item.id === id);
if (!user) {
this.logger.warn(`Користувача з id ${id} не знайдено`);
return null;
}
this.logger.log(`Користувача з id ${id} знайдено`);
return user;
}
}Методи сервісу можна викликати з контролера:
import { Controller, Get, Param } from '@nestjs/common';
import { UsersService } from './users.service';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get()
findAll() {
return this.usersService.findAll();
}
@Get(':id')
findOne(@Param('id') id: string) {
return this.usersService.findOne(Number(id));
}
}Після запуску застосунку запит до GET /users або GET /users/1 створить відповідні записи в консолі.
Контекст допомагає визначити джерело логу. Зазвичай як контекст передають назву класу:
private readonly logger = new Logger(UsersService.name);Можна вказати й власний текст:
private readonly logger = new Logger('PaymentModule');Повідомлення матиме контекст PaymentModule. Для сервісів, контролерів і інших класів зручно використовувати назву класу, щоб не дублювати її вручну.
За замовчуванням NestJS виводить стандартні рівні логів. Під час створення застосунку можна явно вказати, які рівні дозволені.
Файл main.ts:
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const isProduction = process.env.NODE_ENV === 'production';
const app = await NestFactory.create(AppModule, {
logger: isProduction
? ['error', 'warn']
: ['log', 'error', 'warn', 'debug', 'verbose'],
});
await app.listen(3000);
}
bootstrap();У цьому прикладі:
у development виводяться всі основні рівні;
у production виводяться лише error і warn;
інформаційні та детальні діагностичні повідомлення в production не показуються.
Це не означає, що виклики log() або debug() перестануть виконуватися в коді. Вони просто не будуть виведені активним логером.
Увімкнути production-режим можна змінною середовища:
NODE_ENV=production npm run startУ Windows спосіб встановлення змінної середовища може відрізнятися залежно від оболонки.
Приклад main.ts із логуванням запуску застосунку:
import { Logger } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const isProduction = process.env.NODE_ENV === 'production';
const app = await NestFactory.create(AppModule, {
logger: isProduction
? ['error', 'warn']
: ['log', 'error', 'warn', 'debug', 'verbose'],
});
const logger = new Logger('Bootstrap');
await app.listen(3000);
logger.log('Застосунок запущено на порту 3000');
}
bootstrap();Окремий екземпляр Logger можна створити в будь-якому місці, де потрібно записати повідомлення. Для кращої зрозумілості контекст має відповідати частині застосунку, яка створює лог.
У production варто залишати повідомлення, які допомагають швидко знайти проблему:
помилки обробки запитів;
недоступність важливих зовнішніх сервісів;
некоректні або небезпечні стани;
критичні події запуску чи зупинки застосунку.
Не варто записувати в логи:
паролі;
токени доступу;
ключі API;
повні дані банківських карток;
інші секретні або приватні дані.
Наприклад, такий лог небезпечний:
this.logger.log(`Користувач увійшов з паролем: ${password}`);Краще записати лише факт події:
this.logger.log(`Користувач ${userId} успішно увійшов`);console.log() замість Loggerconsole.log() працює, але він не має рівнів NestJS і контексту компонента:
console.log('Користувача створено');У коді NestJS краще використовувати:
this.logger.log('Користувача створено');Якщо записувати повідомлення всередині кожної дрібної операції, консоль швидко стане нечитабельною. Для детальних повідомлень використовуйте debug() або verbose(), а в production вимикайте ці рівні.
Повідомлення без контексту важче аналізувати:
const logger = new Logger();Краще:
const logger = new Logger(UsersService.name);Не додавайте паролі, токени та ключі до тексту повідомлень. Логи часто зберігаються довго і можуть бути доступні кільком членам команди.
NestJS має вбудований клас Logger.
Основні рівні: log, error, warn, debug, verbose і fatal.
Контекст допомагає визначити джерело повідомлення.
Для помилок можна передати стек викликів другим аргументом error().
Список активних рівнів задається під час створення застосунку через параметр logger.
У production зазвичай залишають error і warn, щоб зменшити кількість виводу.
Не використовуйте логи для збереження паролів, токенів та інших секретів.