您的位置:首页 >Linux系统中Node.js日志如何管理
发布于2026-05-03 阅读(0)
扫一扫,手机访问
日志管理,听起来像是运维的“脏活累活”,但处理得当,它却是线上应用稳定性的“眼睛”和“耳朵”。今天,咱们就来聊聊在Linux环境下,如何为你的Node.js应用搭建一套既专业又高效的日志管理体系。
一套完整的日志方案,通常由几个关键环节构成,咱们按层次来梳理。
理论说再多,不如看代码来得直接。下面用几个主流库演示如何快速上手。
使用 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;
运行与级别控制:LOG_LEVEL=debug node app.js
使用 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;
日志轮转是生产环境的必备操作,主要分系统级和应用级两种思路。
系统级方案 logrotate(推荐与 Node.js 解耦)
创建配置文件 /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 等参数。
何时选择哪种方案
应用如何运行,决定了日志如何被收集和管理。
使用 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应用配置为systemd服务后,即可使用 journalctl -u nodeapp 查看日志,-f 参数可以实时跟踪,--since/--until 则用于按时间范围过滤,这是集成到系统日志流的标准化方式。
最后,分享几条从实践中总结的关键原则,帮你避开常见的“坑”。
说到底,日志管理是一项需要结合工具、规范和运维习惯的系统性工作。希望以上梳理的思路和具体示例,能帮助你构建起更清晰、更可靠的Node.js应用可观测性基础。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9