← Назад к вопросам

Какие есть подходы к логированию в Node.js приложениях?

2.3 Middle🔥 211 комментариев
#DevOps и инфраструктура#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие есть подходы к логированию в Node.js приложениях?

Логирование — критически важный аспект разработки приложений. В Node.js есть множество подходов и инструментов.

1. Встроенное логирование: console

console.log('User created:', userId);
console.error('Error occurred:', error);
console.warn('Warning message');

Проблемы: нет временных меток, нет уровней логирования, сложно фильтровать.

2. Winston — самая популярная библиотека

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' }),
    new winston.transports.Console(),
  ],
});

logger.info('Application started');
logger.error('Database connection failed');

3. Pino — быстрое структурированное логирование

const pino = require('pino');

const logger = pino({
  level: process.env.LOG_LEVEL || 'info',
  transport: {
    target: 'pino-pretty',
  },
});

logger.info({ userId: 123 }, 'User login');
logger.error({ error: err }, 'Request failed');

const childLogger = logger.child({ requestId: '123' });
childLogger.info('Processing request');

4. Bunyan — JSON логирование

const bunyan = require('bunyan');

const logger = bunyan.createLogger({
  name: 'myapp',
  streams: [
    { level: 'info', stream: process.stdout },
    { level: 'error', path: './var/log/myapp.log' },
  ],
});

logger.info({ user: 'john' }, 'User registered');

5. Morgan — логирование HTTP запросов

const morgan = require('morgan');
const express = require('express');
const app = express();

app.use(morgan('combined'));
app.use(morgan('dev'));

const accessLogStream = fs.createWriteStream('access.log', { flags: 'a' });
app.use(morgan('combined', { stream: accessLogStream }));

6. Структурированное логирование

class UserService {
  constructor(logger) {
    this.logger = logger;
  }

  async createUser(userData) {
    const startTime = Date.now();
    try {
      this.logger.info({ action: 'user:create', userId: userData.id }, 'Creating user');
      const user = await this.saveToDatabase(userData);
      this.logger.info({ action: 'user:created', userId: user.id }, 'User created');
      return user;
    } catch (error) {
      this.logger.error({ action: 'user:create', error: error.message }, 'Failed');
      throw error;
    }
  }
}

7. Уровни логирования

logger.error('Critical system failure');
logger.warn('Disk space running low');
logger.info('Server started');
logger.http('GET /api/users 200');
logger.debug('Query executed in 15ms');
logger.trace('Function call');

8. Контекстное логирование

const { v4: uuidv4 } = require('uuid');

app.use((req, res, next) => {
  req.id = req.headers['x-request-id'] || uuidv4();
  req.logger = logger.child({ requestId: req.id });
  
  req.logger.info({ method: req.method, path: req.path }, 'Incoming request');
  next();
});

app.get('/users/:id', (req, res) => {
  req.logger.info({ userId: req.params.id }, 'Fetching user');
  const user = getUserFromDB(req.params.id);
  res.json(user);
});

9. Логирование ошибок

process.on('unhandledRejection', (reason, promise) => {
  logger.error({ error: reason, type: 'unhandledRejection' });
});

process.on('uncaughtException', (error) => {
  logger.error({ error: error.message, stack: error.stack });
});

10. Централизованное логирование

const logger = pino({
  level: 'info',
}, pino.transport({
  target: 'pino-datadog',
  options: {
    ddApiKey: process.env.DD_API_KEY,
    service: 'my-app',
    environment: process.env.NODE_ENV,
  },
}));

Рекомендуемый набор

Для разработки: Pino или Winston с красивым форматированием + Morgan

Для production: Pino + транспорты в Datadog/ELK/CloudWatch + структурированное JSON

Чеклист

  • Используй правильные уровни логирования
  • Логируй структурированные данные (JSON)
  • Добавляй контекст (requestId, userId)
  • Не логируй чувствительные данные
  • Используй разные транспорты для разных окружений
  • Централизуй логи в production
  • Ротируй и архивируй логи
Какие есть подходы к логированию в Node.js приложениях? | PrepBro