在 Node.js 中过滤日志内容,常见做法有 代码层过滤、日志库配置过滤、运行时过滤 和 日志采集端过滤。下面按使用场景给你一个完整说明。
winston(最常用)const winston = require('winston');
const logger = winston.createLogger({
level: 'info', // 只输出 info 及以上级别
transports: [
new winston.transports.Console()
]
});
logger.debug('调试信息'); // 不会输出
logger.info('普通信息');
logger.error('错误信息');
✅ 常用级别(从低到高):
debug < info < warn < error
const { createLogger, format, transports } = require('winston');
const logger = createLogger({
format: format.combine(
format.printf(info => {
if (info.message.includes('敏感词')) return null;
return `${info.level}: ${info.message}`;
})
),
transports: [new transports.Console()]
});
pino(高性能)const pino = require('pino');
const logger = pino({
level: 'warn' // 只输出 warn+
});
logger.info('info'); // 不输出
logger.warn('warn');
const logLevel = process.env.NODE_ENV === 'production'
? 'error'
: 'debug';
const logger = winston.createLogger({
level: logLevel
});
function log(msg) {
if (msg.includes('password')) return;
console.log(msg);
}
❌ 缺点:侵入性强、难维护
DEBUG 环境变量(debug 库)const debug = require('debug')('app');
debug('调试信息');
运行:
DEBUG=app node index.js
过滤多个模块:
DEBUG=app,api,db
node app.js | grep -v "healthcheck"
✅ 适合临时排查问题
如果你使用:
可以在采集或查询阶段过滤:
{
"query": {
"bool": {
"must_not": {
"match": {
"message": "heartbeat"
}
}
}
}
}
function sanitize(msg) {
return msg.replace(/password=\w+/g, 'password=***');
}
transports: [
new winston.transports.File({
filename: 'error.log',
level: 'error'
})
]
✅ 生产环境:
winston / pino✅ 开发环境:
debug 库如果你愿意,可以告诉我:
我可以直接帮你写一份可用的配置代码。