首段
用Node.js SDK(morgan中间件)快速为服务器配置访问日志,自动记录每次JS请求的IP、方法、路径、状态码和响应时间,这是排查线上问题、分析性能瓶颈的标准化操作。
Node.js 访问日志怎么设置:morgan中间件实战
选择morgan的理由
行业共识认为,访问日志是运维最基础的监控手段之一,在Node.js生态中,morgan是专门为HTTP请求设计的日志中间件,安装即用,支持多种预设格式和自定义输出流,它不依赖复杂配置,却能覆盖80%的日志场景:从开发环境控制台输出到生产环境文件记录,一行代码即可切换。
安装与基础配置
在Express或Koa项目中,安装morgan只需一条命令:
npm install morgan
然后在入口文件中挂载中间件,以Express为例,最精简的配置是:
const express = require('express');
const morgan = require('morgan');
const fs = require('fs');
const path = require('path');
const app = express();
// 创建写入流
const accessLogStream = fs.createWriteStream(
path.join(__dirname, 'access.log'),
{ flags: 'a' }
);
// 使用combined格式输出到文件
app.use(morgan('combined', { stream: accessLogStream }));
combined格式是Apache标准日志格式,包含IP、时间、请求方法、路径、HTTP版本、状态码、响应字节数、Referer、User-Agent,如果只想在终端看到简洁信息,可改用dev格式,它会在控制台用颜色标注状态码,开发阶段非常方便。
自定义日志格式,精准匹配业务场景
预设格式无法满足所有需求时,可以自定义token,需要记录请求体中的某个参数或用户ID:
morgan.token('user-id', (req) => {
return req.user ? req.user.id : 'anonymous';
});
app.use(morgan(':remote-addr :method :url :status :user-id :response-time ms'));
常用的自定义token可以组合成完整格式字符串,推荐将响应时间、状态码、请求路径作为核心字段,因为这三个字段能快速定位慢请求和错误请求。
js请求日志记录:从配置到分析
使用winston增强日志管理
morgan侧重于请求层,但业务日志(如数据库查询、第三方服务调用)也需要统一管理,winston是Node.js的多通道日志库,可以同时输出到文件、控制台、远程服务器,将morgan与winston结合,能实现日志分级、多目标输出。
操作步骤:
- 安装winston和winston-daily-rotate-file(用于日志轮转)。
- 创建winston logger,配置info、error等级别。
- 将morgan的stream指向logger的write方法。
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new DailyRotateFile({
filename: 'logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '30d'
})
]
});
// 让morgan的日志通过winston输出
app.use(morgan('combined', {
stream: {
write: (message) => logger.info(message.trim())
}
}));
这样做的好处是,访问日志与应用日志存储在同一个日切文件体系下
,按日期归档,方便后期用ELK或Grafana统一检索。
记录关键字段,避免信息过载
并非所有请求字段都需要记录,根据经验,重点关注以下五个字段即可覆盖大多数排查场景:
- remote-addr:客户端IP,用于安全审计。
- method & url:接口路径,定位问题接口。
- status:状态码,区分正常和异常请求。
- response-time:响应时间,捕捉慢请求。
- user-agent:客户端类型,识别爬虫或异常流量。
不建议记录请求体(body),除非是POST接口调试期,否则会快速膨胀日志体积,且可能泄露敏感数据。
服务器访问日志配置:轮转与存储策略
日志文件过大怎么办
访问日志持续增长,单个文件会迅速撑满磁盘,解决方案是日志轮转:按时间或大小切割文件,并自动压缩旧日志。
使用morgan时可以配合rotating-file-stream包:
const rfs = require('rotating-file-stream');
const accessLogStream = rfs.createStream('access.log', {
interval: '1d', // 每天切分
size: '10M', // 文件达到10MB时也切分
path: path.join(__dirname, 'logs'),
compress: 'gzip' // 自动压缩旧日志
});
app.use(morgan('combined', { stream: accessLogStream }));
保留周期建议设为30天,线上环境可根据磁盘容量调整,对于大型项目,可使用winston-daily-rotate-file,同样支持按日期轮转和最大文件数限制。
日志存储位置与命名规范
- 将日志文件统一放在项目根目录下的
logs/文件夹,不要与代码混在一起。 - 文件名包含日期和实例标识,如
access-2026-05-20-instance-1.log,方便多实例部署时区分。 - 使用
.gitignore忽略日志目录,避免提交到版本库。
Q&A:Node.js 访问日志怎么设置常见问题
Node.js 访问日志怎么设置才不会影响性能?
morgan本身是异步写入,生产环境建议使用combined或short格式,并输出到文件而非控制台,如果请求量极高(每秒数千次),可以将日志写入内存缓冲,再由单独进程批量写入,或直接发送到远程日志服务(如简米云日志服务、ELK)。绝大多数场景下,直接使用morgan配合文件轮转即可,性能损耗可以忽略。
js请求日志应该记录哪些字段?
最少记录:IP、时间戳、HTTP方法、请求路径、状态码、响应时间,如果需要分析用户行为,可增加User-Agent和Referer。避免记录敏感信息,如密码、Token、完整请求体,如果业务需要记录用户ID,建议单独放在自定义token中,并确保日志文件权限仅限运维人员访问。
访问日志文件太大如何处理?
启用日志轮转,按天切割(interval: '1d')并设置最大文件大小(size: '10M'),同时开启自动压缩,保留最近30天的日志,更早的日志自动删除,对于历史日志,可使用gzip压缩归档,节省磁盘空间。定期查看日志目录大小,确保日志分区有足够余量,避免磁盘写满导致应用异常。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/549752.html




