Журнал: встроенный 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 и другими.
Частая ошибка
В журнал записывают всё тело запроса или объект пользователя целиком — и туда попадают пароли, токены и хеши. Журналы часто хранятся дольше базы и доступны большему числу людей. Пишите в журнал номера и короткие описания событий, а не данные пользователей.