首页 > 解决方案 > 在我的 Nodejs+React+Mongo 应用程序中实现日志记录;如何确保它的可扩展性?

问题描述

我有一个正在实现登录的 MERN 网络应用程序。

该应用程序处于开发初期,但我知道它将在未来数月和数年内扩展。

那么,在实现日志时有哪些最佳实践/需要注意的事项?

具体来说,


谢谢!:)

标签: node.jsreactjsmongodblogging

解决方案


我应该如何构建我的日志架构?

大多数情况下,这取决于您的需要,您需要以特定格式对日志进行结构化,以便稍后将它们转换为一些有意义的数据。大多数情况下,您需要、username和被记录。iptimestampaction

我应该强制执行日志类型、类别等吗?

再次取决于但大多数时候是的,应该这样做。

是否有任何 npm-packages 可以让我的生活更轻松?

winston是在 nodejs 中实现日志记录的流行选择

你可以这样做:

import winston from 'winston';
import config from '../config/config';
import {LOGGER_LEVELS} from '../utils/app.constants';
const {combine, timestamp, label, printf, errors, metadata} = winston.format;

const myFormat = printf(({level, message, label, timestamp}) => {
  return `[${level}] ${label} ${timestamp} ${message}`;
}); // any format you desire

const transports: any = [];
if (process.env.NODE_ENV !== 'development') {
  transports.push(
    new winston.transports.Console(),
    new winston.transports.File({
      filename: 'combined.log', // can save the logs to a file 
      level: LOGGER_LEVELS.INFO
    }),
    new winston.transports.File({
      filename: 'error.log',
      level: LOGGER_LEVELS.ERROR
    })
  );
} else { // for development you want the console to be printed on terminal
  transports.push(
    new winston.transports.Console({
      format: winston.format.combine(winston.format.cli(), winston.format.splat())
    })
  );
}

const LoggerInstance = winston.createLogger({
  level: config.logs.level,
  levels: winston.config.npm.levels,
  format: combine(
    label({label: 'date:'}),
    timestamp({
      format: 'MM-DD-YYYY HH:mm:ss'
    }),
    errors({stack: true}),
    myFormat
  ),
  transports
});

export default LoggerInstance;

然后无论您需要在哪里使用它,只需创建一个记录器实例,您就可以使用它。

LoggerInstance.log({
      level: LOGGER_LEVELS.INFO,
      message: <any_message>
    });

推荐阅读