console模块Node.js内置的console模块是最简单的日志输出方式,适用于开发调试阶段。通过console.log()输出普通信息,console.error()输出错误信息,日志直接显示在终端或重定向到文件(如node app.js > app.log 2>&1)。
缺点:缺乏日志级别控制、格式化功能和持久化策略,不适合生产环境。
Winston是Node.js最流行的日志库,支持多传输目标(控制台、文件、HTTP、数据库等)、日志级别(error、warn、info、debug等)和结构化日志(JSON格式)。
配置示例:
const winston = require('winston');
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info', // 通过环境变量动态设置级别
format: winston.format.combine(
winston.format.timestamp(), // 添加时间戳
winston.format.json() // 结构化输出
),
transports: [
new winston.transports.Console(), // 输出到控制台
new winston.transports.File({ filename: 'error.log', level: 'error' }), // 错误日志单独文件
new winston.transports.File({ filename: 'combined.log' }) // 所有日志合并文件
]
});
logger.info('Server started on port 3000');
logger.error('Database connection failed');
特点:功能全面,适合大多数生产场景;可通过winston-daily-rotate-file插件实现日志轮转。
Pino以极致性能著称(比Winston快3倍以上),适合高负载应用(如实时系统、微服务)。默认输出JSON格式,支持pino-pretty插件美化终端输出。
配置示例:
const pino = require('pino');
const logger = pino({
level: 'info',
transport: {
target: 'pino-pretty', // 终端美化输出
options: { colorize: true } // 彩色日志
}
});
logger.info('User logged in', { userId: 123 }); // 结构化日志(带上下文)
logger.error('Invalid request', { statusCode: 400, path: '/login' });
特点:低开销,适合对性能敏感的场景;结构化日志便于后续分析。
Bunyan输出JSON格式日志,便于与日志分析工具(如ELK、Splunk)集成,适合企业级应用。
配置示例:
const bunyan = require('bunyan');
const logger = bunyan.createLogger({
name: 'my-app', // 应用名称(日志标识)
level: 'info',
streams: [
{ level: 'info', stream: process.stdout }, // 输出到控制台
{ level: 'error', path: 'app-error.log' } // 错误日志写入文件
]
});
logger.info('Request received', { method: 'GET', url: '/api/users' });
logger.error('Server error', { err: new Error('Internal Server Error') });
特点:结构化日志标准化,适合复杂系统;支持日志流(如写入文件、远程服务器)。
日志文件过大会占用大量磁盘空间,需通过轮转策略(按时间/大小分割、压缩、删除旧日志)解决。Linux系统自带logrotate工具是首选。
配置步骤:
logrotate(如未安装):sudo apt-get install logrotate(Ubuntu/Debian)或sudo yum install logrotate(CentOS/RHEL)。/etc/logrotate.d/nodejs):/var/log/nodejs/*.log { # 匹配日志路径(需替换为实际路径)
daily # 每天轮转
rotate 7 # 保留最近7天日志
compress # 压缩旧日志(.gz格式)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 0640 root adm # 新日志文件权限和所有者
}
sudo logrotate -vf /etc/logrotate.d/nodejs(强制立即轮转)。app.log.2025-11-08.gz),保留7天内的压缩日志,节省存储空间。PM2是Node.js进程管理工具,内置日志聚合、轮转和实时流功能,适合生产环境部署。
常用命令:
pm2 start app.js --name "my-app" # 启动应用并命名
pm2 logs my-app # 实时查看所有日志(控制台输出+文件日志)
pm2 logs my-app --lines 100 # 查看最近100行日志
pm2 save # 保存当前进程列表(防止重启丢失)
pm2 startup # 设置开机自启
日志轮转配置(通过PM2配置文件ecosystem.config.js):
module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
log_date_format: 'YYYY-MM-DD HH:mm Z', // 日志时间格式
out_file: '/var/log/nodejs/my-app.log', // 标准输出日志路径
error_file: '/var/log/nodejs/my-app-error.log', // 错误输出日志路径
merge_logs: true, // 合并stdout和stderr
log_rotate: true, // 开启轮转
log_size: '10M', // 单个日志文件最大10MB
log_retain: 7 // 保留7个日志文件
}]
};
特点:简化日志管理流程,支持集群模式下的日志聚合,适合分布式系统。
对于分布式系统或多节点应用,集中式日志管理是必要的。ELK Stack(Elasticsearch + Logstash + Kibana)是经典解决方案,可实现日志收集、存储、搜索和可视化。
配置步骤:
const winston = require('winston');
require('winston-logstash').Logstash; // 引入Logstash传输
const logger = winston.createLogger({
transports: [
new winston.transports.Logstash({
port: 5000, // Logstash监听端口
host: 'localhost', // Logstash服务器地址
max_connect_retries: -1 // 无限重试
})
]
});
nodejs-*),通过Dashboard展示日志趋势、错误统计等。debug(详细信息),生产环境用info(关键流程)或error(仅错误),避免日志冗余。timestamp、level、message、context(如用户ID、请求ID)等字段,便于后续分析。logrotate或PM2配置,防止日志文件过大导致磁盘空间耗尽。cabin.js等库自动屏蔽日志中的敏感字段(如密码、信用卡号),避免信息泄露。