大家都是怎么实现生产环境下的Nodejs日志呢

大家都是怎么实现生产环境下的Nodejs日志呢

如题

想在生产环境下使用的话,最基本的分级,分时日志应该是必须的

我想实现每天新建一个以日期命名的文件夹,然后在该文件夹按照不同等级(info,error,…)分为不同的文件写入日志

有什么简单可行的方法么

3 回复

当然可以!在生产环境中管理日志是一个非常重要的任务。我们可以使用一些成熟的库来帮助我们实现这一点。以下是一个简单的示例,展示如何使用 winston 库来实现你所描述的日志管理需求。

安装依赖

首先,你需要安装 winstonwinston-daily-rotate-file 这两个库:

npm install winston winston-daily-rotate-file

示例代码

接下来,你可以创建一个简单的日志配置文件,例如 logger.js

const { createLogger, format, transports } = require('winston');
const { combine, timestamp, printf } = format;

// 自定义日志格式
const myFormat = printf(info => {
  return `${info.timestamp} ${info.level}: ${info.message}`;
});

const logger = createLogger({
  level: 'info',
  format: combine(
    timestamp(),
    myFormat
  ),
  transports: [
    new transports.DailyRotateFile({
      filename: 'logs/%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      zippedArchive: true,
      maxSize: '20m',
      maxFiles: '14d',
      json: false,
      format: combine(
        timestamp(),
        myFormat
      )
    })
  ]
});

// 如果不是生产环境,则将日志输出到控制台
if (process.env.NODE_ENV !== 'production') {
  logger.add(new transports.Console({
    format: combine(
      timestamp(),
      myFormat
    )
  }));
}

module.exports = logger;

解释

  1. 自定义日志格式:我们定义了一个简单的日志格式,包含时间戳、日志级别和消息。
  2. DailyRotateFilewinston-daily-rotate-file 提供了按日期轮转日志文件的功能。我们设置日志文件每天生成一个新的,并且归档为 .zip 文件。
  3. 日志级别:我们设置了日志的最低级别为 info,这意味着所有 info 及以上级别的日志都会被记录。
  4. 多环境支持:如果当前环境不是生产环境(即 NODE_ENV 不等于 'production'),则将日志输出到控制台。

使用日志

在你的应用中引入并使用这个日志配置:

const logger = require('./logger');

logger.info('This is an info message.');
logger.error('This is an error message.');

这样,你就可以在生产环境中按日期和级别来管理日志文件了。希望这对你有帮助!


在生产环境中实现Node.js的日志记录,通常需要满足以下几个需求:分级日志、按时间分割日志文件、以及方便查看和管理。这里提供一种基于winston库的方法来实现这些需求。

使用 winston 实现日志管理

winston 是一个强大的日志库,支持多种运输方式(transports),包括文件运输,非常适合生产环境下的日志管理。我们可以配置winston来创建每日日志文件,并根据日志级别(如info, error等)存储在不同的文件中。

示例代码

首先安装winston和它的日志文件运输器(file transport):

npm install winston winston-daily-rotate-file

然后创建一个日志配置文件:

const { createLogger, format, transports } = require('winston');
const { combine, timestamp, printf } = format;

// 定义自定义日志格式
const myFormat = printf(info => {
  return `${info.timestamp} ${info.level}: ${info.message}`;
});

const logger = createLogger({
  format: combine(
    timestamp(),
    myFormat
  ),
  transports: [
    new transports.DailyRotateFile({
      filename: 'logs/%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      zippedArchive: true,
      maxSize: '20m',
      maxFiles: '14d',
      level: 'info', // 控制信息级别的日志文件
    }),
    new transports.DailyRotateFile({
      filename: 'logs/error-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      zippedArchive: true,
      maxSize: '20m',
      maxFiles: '14d',
      level: 'error', // 控制错误级别的日志文件
      handleExceptions: true,
      humanReadableUnhandledException: true,
    })
  ],
});

// 输出到控制台
if (process.env.NODE_ENV !== 'production') {
  logger.add(new transports.Console());
}

module.exports = logger;

解释

  1. 自定义日志格式:我们定义了一个简单的日志格式,包含时间戳、日志级别和消息内容。
  2. 每日轮转文件传输器DailyRotateFile用于创建每日的轮转日志文件。你可以设置文件名模板(例如%DATE%.log),日期模式(如YYYY-MM-DD),最大文件大小(如20m),以及文件保留天数(如14d)。
  3. 控制台输出:如果应用运行在开发环境(非生产环境),我们添加一个控制台传输器以便于调试。

通过这种方式,我们可以轻松地管理生产环境中的日志记录,确保日志文件被合理组织并易于维护。

回到顶部