选择winston的原因
- 灵活性:Winston 提供了非常灵活的日志记录配置选项。它允许开发人员自定义日志格式、日志级别、日志输出目标(如文件、控制台、远程服务器等),对于一个Web应用,可能需要将请求日志和错误日志分别输出到不同的文件或者目标,Winston能很好满足这种需求。
- 功能丰富:除了基本的日志记录,Winston还支持日志轮转(log rotation),这对于管理大量日志文件非常有用,随着应用运行,日志文件可能会不断增大,日志轮转可以定期创建新的日志文件并压缩旧文件,避免单个日志文件过大。
- 错误处理:在处理错误日志方面,Winston可以更方便地进行结构化日志记录,将错误的详细信息(如堆栈跟踪等)完整记录下来,便于排查问题。
选择morgan的原因
- 专注于HTTP请求日志:Morgan是专门为记录HTTP请求日志设计的,非常适合Web应用记录请求日志。它有多种预定义的日志格式,使用简单,一行代码就可以开始记录请求日志。
- 轻量级:对于仅需要简单记录请求日志的场景,Morgan是轻量级的选择,不会引入过多复杂的功能。
若同时记录请求日志和错误日志,更倾向选择winston
基础配置示例
- 安装winston:
npm install winston
- 配置文件(假设为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;
- 在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}`);
});