MST

星途 面试题库

面试题:Node.js日志管理之中等难度:日志库选择与基本配置

在Node.js项目中,常见的日志管理库有winston和morgan等。假设你要开发一个简单的Web应用,记录请求日志和错误日志,你会选择哪个库?请阐述原因,并简单描述如何进行基础配置。
44.6万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

选择winston的原因

  1. 灵活性:Winston 提供了非常灵活的日志记录配置选项。它允许开发人员自定义日志格式、日志级别、日志输出目标(如文件、控制台、远程服务器等),对于一个Web应用,可能需要将请求日志和错误日志分别输出到不同的文件或者目标,Winston能很好满足这种需求。
  2. 功能丰富:除了基本的日志记录,Winston还支持日志轮转(log rotation),这对于管理大量日志文件非常有用,随着应用运行,日志文件可能会不断增大,日志轮转可以定期创建新的日志文件并压缩旧文件,避免单个日志文件过大。
  3. 错误处理:在处理错误日志方面,Winston可以更方便地进行结构化日志记录,将错误的详细信息(如堆栈跟踪等)完整记录下来,便于排查问题。

选择morgan的原因

  1. 专注于HTTP请求日志:Morgan是专门为记录HTTP请求日志设计的,非常适合Web应用记录请求日志。它有多种预定义的日志格式,使用简单,一行代码就可以开始记录请求日志。
  2. 轻量级:对于仅需要简单记录请求日志的场景,Morgan是轻量级的选择,不会引入过多复杂的功能。

若同时记录请求日志和错误日志,更倾向选择winston

基础配置示例

  1. 安装winston
npm install winston
  1. 配置文件(假设为logger.js)
const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    // 记录到文件
    new winston.transport.Console({
      filename: 'error.log',
      level: 'error'
    }),
    new winston.transport.Console({
      filename:'request.log',
      level: 'info'
    })
  ]
});

// 如果是开发环境,也输出到控制台
if (process.env.NODE_ENV!== 'production') {
  logger.add(new winston.transport.Console({
    format: winston.format.simple()
  }));
}

module.exports = logger;
  1. 在Web应用中使用
const express = require('express');
const app = express();
const logger = require('./logger');

app.use((req, res, next) => {
  logger.info({
    method: req.method,
    url: req.url,
    headers: req.headers
  });
  next();
});

app.use((err, req, res, next) => {
  logger.error({
    message: err.message,
    stack: err.stack
  });
  res.status(500).send('Internal Server Error');
});

const port = 3000;
app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});