node.js - 在我的 Nodejs+React+Mongo 应用程序中实现日志记录;如何确保它的可扩展性?
问题描述
我有一个正在实现登录的 MERN 网络应用程序。
该应用程序处于开发初期,但我知道它将在未来数月和数年内扩展。
那么,在实现日志时有哪些最佳实践/需要注意的事项?
具体来说,
- 我应该如何构建我的日志架构?
- 我应该强制执行日志类型、类别等吗?
- 是否有任何 npm-packages 可以让我的生活更轻松?
谢谢!:)
解决方案
我应该如何构建我的日志架构?
大多数情况下,这取决于您的需要,您需要以特定格式对日志进行结构化,以便稍后将它们转换为一些有意义的数据。大多数情况下,您需要、username
和被记录。ip
timestamp
action
我应该强制执行日志类型、类别等吗?
再次取决于但大多数时候是的,应该这样做。
是否有任何 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>
});
推荐阅读
- r - How to sum specific rows in a dataframe using R?
- java - checking name in list it is there than update client table else category and client table
- c# - Is there any alternative to DragOver to suppress glyph on drag drop?
- python - How can i break a for-loop with an key event?
- rust - 包 XXX 链接到本机库 YYY,但它与之前也链接到 YYY 的包冲突:package ZZZ
- php - 为多个时间范围设置 PHP cronjob
- google-assistant-sdk - 为 Traits 调用确定的执行器
- terraform - 使用什么 terraform 命令来检查资源创建状态?
- r - Change sub-titles in lattice/densityplot
- json - 在 J2EE 服务器上交付服务时,REST 服务在哪些层工作?