在 Node.js 中“过滤关键日志”常见有几种场景,不同场景做法不一样。下面按从简单到专业的方式给你总结,附示例。
console + 条件过滤(不推荐生产)适合临时调试。
const LOG_LEVEL = 'error'; // 'info' | 'warn' | 'error'
function log(level, msg) {
const levels = ['info', 'warn', 'error'];
if (levels.indexOf(level) >= levels.indexOf(LOG_LEVEL)) {
console[level](msg);
}
}
log('info', '这是普通日志');
log('error', '这是错误日志');
✅ 优点:简单
❌ 缺点:功能弱、不可扩展
npm install winston
const winston = require('winston');
const logger = winston.createLogger({
level: 'info', // 只输出 info 及以上级别
transports: [
new winston.transports.Console()
]
});
logger.info('普通信息');
logger.warn('警告');
logger.error('错误');
✅ 修改 level 即可过滤日志:
| level | 过滤结果 |
|---|---|
| error | 只显示 error |
| warn | error + warn |
| info | info + warn + error |
const { createLogger, format, transports } = require('winston');
const { combine, printf } = format;
const keywordFilter = (keyword) =>
printf((info) => {
if (info.message.includes(keyword)) {
return `${info.level}: ${info.message}`;
}
return '';
});
const logger = createLogger({
transports: [
new transports.Console({
format: combine(
keywordFilter('订单')
)
})
]
});
logger.info('订单创建成功');
logger.info('用户登录成功'); // 会被过滤掉
✅ 适合:
const level = process.env.NODE_ENV === 'production' ? 'error' : 'info';
const logger = createLogger({
level,
transports: [new transports.Console()]
});
transports: [
new transports.File({ filename: 'error.log', level: 'error' }),
new transports.File({ filename: 'combined.log' })
]
✅ 实现:
✅ Winston + 日志级别 + 环境 + 文件拆分
const { createLogger, format, transports } = require('winston');
const logger = createLogger({
level: process.env.LOG_LEVEL || 'info',
format: format.combine(
format.timestamp(),
format.json()
),
transports: [
new transports.Console(),
new transports.File({ filename: 'app.log' })
]
});
| 框架 | 建议 |
|---|---|
| Express | morgan + winston |
| NestJS | 内置 Logger 或 Winston |
| Koa | koa-logger / winston |
Node.js 过滤关键日志 = 选日志库 + 用级别 + 按关键字 / 模块过滤 + 按环境控制
如果你愿意,可以告诉我:
我可以直接帮你写一套可复制粘贴的日志方案。