阅读量:3
Linux环境下Node.js日志配置指南
一 基础方案与日志库选型
- 使用内置 console:最简单,适合快速开发与调试;生产环境建议配合文件写入或接入日志框架。
- 结构化日志库:
- Winston:生态成熟,支持多传输(文件、控制台、HTTP)、多格式、灵活扩展。
- Pino:高性能、低开销,适合高并发场景,配合 pino-pretty 可读性好。
- Bunyan:默认 JSON 输出,便于机器解析与检索。
- Log4js:功能丰富,支持按日期/大小滚动、多输出目标。
- 日志级别建议:按重要性从低到高使用 error、warn、info、http、verbose、debug;通过环境变量(如 LOG_LEVEL)动态控制,便于不同环境切换。
二 快速上手示例
- 使用 Winston 输出到控制台与文件(按级别分流)
// logger.js
const winston = require('winston');
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.errors({ stack: true }),
winston.format.splat(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
new winston.transports.File({ filename: 'logs/combined.log' })
]
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize(),
winston.format.simple()
)
}));
}
module.exports = logger;
- 使用 Pino 高性能输出(开发环境美化)
// logger-pino.js
const pino = require('pino');
const logger = pino(
{
level: process.env.LOG_LEVEL || 'info',
timestamp: pino.stdTimeFunctions.isoTime
},
pino.destination('./logs/app.log')
);
// 开发时可在控制台美化输出
if (process.env.NODE_ENV !== 'production') {
const pretty = require('pino-pretty');
logger.info = (...args) => require('pino').info(pretty({ colorize: true }), ...args);
}
module.exports = logger;
- 使用 Log4js 按日期滚动
// logger-log4js.js
const log4js = require('log4js');
log4js.configure({
appenders: {
out: { type: 'stdout' },
app: {
type: 'dateFile',
filename: 'logs/app',
pattern: 'yyyy-MM-dd.log',
alwaysIncludePattern: true,
daysToKeep: 90,
compress: true
}
},
categories: {
default: { appenders: ['out', 'app'], level: 'info' }
}
});
const logger = log4js.getLogger();
module.exports = logger;
- 运行与级别控制
LOG_LEVEL=debug node app.js
以上示例覆盖了控制台与文件输出、按级别分流、JSON 结构化、开发/生产差异化以及按日期滚动等常见需求。
三 日志轮转与保留策略
- 系统级方案 logrotate(推荐与 Node.js 解耦)
- 安装(如未安装):Debian/Ubuntu 执行 sudo apt-get install logrotate;CentOS/RHEL 执行 sudo yum install logrotate。
- 创建配置 /etc/logrotate.d/nodejs-app:
/path/to/your/nodejs/logs/*.log { daily rotate 7 compress delaycompress missingok notifempty create 640 root adm sharedscripts postrotate # 若你的进程支持 USR1 触发重新打开日志,可在此发送信号 # [ ! -f /var/run/nodeapp.pid ] || kill -USR1 $(cat /var/run/nodeapp.pid) endscript } - 测试与强制执行:
sudo logrotate -d /etc/logrotate.d/nodejs-app # 语法检查 sudo logrotate -f /etc/logrotate.d/nodejs-app # 强制执行一次
- 应用内方案(库自带轮转)
- Winston + winston-daily-rotate-file
const DailyRotateFile = require('winston-daily-rotate-file'); const transport = new DailyRotateFile({ filename: 'logs/application-%DATE%.log', datePattern: 'YYYY-MM-DD', zippedArchive: true, maxSize: '20m', maxFiles: '14d' }); - Log4js dateFile 已在上一节示例中展示(支持 daysToKeep、compress 等)。
- Winston + winston-daily-rotate-file
- 何时选择哪种方案
- 系统级:与运行时解耦、统一运维策略、适合多进程/多实例。
- 应用级:更细粒度控制(按大小/时间/压缩策略)、便于随应用打包与迁移。
四 运行方式与系统日志集成
- 使用 PM2 管理进程与日志
- 安装与启动:sudo npm install -g pm2,然后 pm2 start app.js --name my-app。
- 查看日志:pm2 logs my-app;按文件输出可在配置中指定 error_file 与 out_file。
- 内置日志轮转插件:pm2 install pm2-logrotate,常用设置示例:
pm2 set pm2-logrotate:max_size 10M pm2 set pm2-logrotate:retain 5 pm2 set pm2-logrotate:workerInterval 2
- 使用 systemd + journalctl
- 以服务运行 Node.js 应用后,使用 journalctl -u nodeapp 查看日志,-f 实时跟踪,–since/–until 时间过滤。
- 常用命令行查看
- tail -f app.log(实时查看)、cat app.log、grep “error” app.log(关键词检索)。
五 生产实践与注意事项
- 始终使用结构化日志(JSON),便于 ELK/EFK/Loki 等系统解析与检索;在开发环境可接入美化工具提升可读性。
- 采用按级别分流:将 error 单独写入错误日志,便于告警与快速定位;info/warn 写入综合日志。
- 规范日志字段:包含 timestamp、level、service/name、trace_id/request_id、msg、err.stack 等上下文,避免记录敏感信息(如密码、密钥)。
- 做好保留与压缩策略:结合磁盘容量设置 rotate 7/14/30、compress,定期清理历史日志。
- 避免仅用 console.log:在生产使用成熟日志库,确保可配置、可扩展、可观测性一致。
- 若应用为多进程/多实例,优先采用系统级 logrotate 或 PM2 日志机制,减少应用内文件句柄竞争与轮转不一致问题。
以上就是关于“Linux环境下Node.js日志配置指南”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm