Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Журнал: встроенный Logger

Журнал (лог) — сообщения, которые сервер пишет о своей работе: запуск, ошибки, важные действия пользователей. По журналу ищут причину сбоя на сервере, где отладчика нет. Вместо console.log() в NestJS используют встроенный класс Logger: он добавляет время, уровень важности и имя класса, из которого пришло сообщение.

Logger в сервисе

// src/posts/posts.service.ts
import { Injectable, Logger } from '@nestjs/common';
import { CreatePostDto } from './dto/create-post.dto';
 
@Injectable()
export class PostsService {
  private readonly logger = new Logger(PostsService.name);
 
  create(dto: CreatePostDto) {
    this.logger.log(`Создаётся статья «${dto.title}»`);
    // ...сохранение в базу
  }
}

new Logger(PostsService.name) создаёт журнал с меткой — именем класса. Создайте статью, и в терминале появится строка:

[Nest] 12345  - 10/03/2026, 10:15:00 AM     LOG [PostsService] Создаётся статья «Привет, Nest»

В ней номер процесса, время, уровень и метка. По метке сразу видно, какой класс написал сообщение.

Уровни

МетодУровеньДля чего
logger.fatal()fatalСбой, после которого работа невозможна
logger.error()errorОшибка, запрос не выполнен
logger.warn()warnПодозрительная ситуация
logger.log()logОбычное событие
logger.debug()debugПодробности для отладки
logger.verbose()verboseОчень подробные сведения

Ошибку записывают вместе со стеком вызовов, чтобы найти строку, где она произошла:

// src/posts/posts.service.ts
try {
  await this.postsRepository.save(post);
} catch (error) {
  this.logger.error('Не удалось сохранить статью', error.stack);
  throw error;
}

Выбор уровней

На рабочем сервере подробные сообщения не нужны. Уровни, которые попадут в журнал, задают при создании приложения:

// src/main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
 
async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    logger: process.env.NODE_ENV === 'production'
      ? ['fatal', 'error', 'warn', 'log']
      : ['fatal', 'error', 'warn', 'log', 'debug', 'verbose'],
  });
  await app.listen(process.env.PORT ?? 3000);
}
bootstrap();

При разработке видны все сообщения, а на сервере — без debug и verbose.

Журнал в формате JSON

Системы сбора журналов удобнее читают JSON. В NestJS 11 встроенный журнал умеет выводить его сам:

// src/main.ts
import { ConsoleLogger } from '@nestjs/common';
 
const app = await NestFactory.create(AppModule, {
  logger: new ConsoleLogger({ json: true }),
});

Каждое сообщение станет одной строкой JSON с полями level, context, message и другими.

Частая ошибка

В журнал записывают всё тело запроса или объект пользователя целиком — и туда попадают пароли, токены и хеши. Журналы часто хранятся дольше базы и доступны большему числу людей. Пишите в журнал номера и короткие описания событий, а не данные пользователей.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.