Ubuntu下Node.js日志如何管理
在Ubuntu系统中管理Node.js日志,核心是防止磁盘撑爆和快速定位问题。可使用系统工具logrotate自动轮转压缩,或借助PM2内置日志管理。需自定义格式与输出时,可选Winston或Pino库,前者生态丰富,后者性能极高。
Ubuntu下Node.js日志管理指南

在Ubuntu系统里管理Node.js日志,其实核心就两件事:一是别让日志撑爆磁盘,二是出问题时能快速定位。系统级的logrotate和进程管理工具PM2能帮你“不碰代码就搞定日志轮转”;而应用层的winston、pino这类库则适合对日志格式、输出场景有定制需求的场景。下面具体拆开来看。
一、使用logrotate系统工具(推荐)
logrotate是Ubuntu自带的老牌日志管理工具,无需修改应用代码就能自动完成日志轮转、压缩和清理。对绝大多数Node应用来说,这是最省心的方案。
1. 安装logrotate
sudo apt-get update && sudo apt-get install logrotate
2. 配置Node.js日志轮转
在/etc/logrotate.d/下新建一个配置文件(比如叫nodejs),写入以下内容(路径按实际情况调整):
/var/log/nodejs/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
systemctl restart your-nodejs-app
endscript
}
这段配置的意思是:每天轮转一次,保留最近7天的日志,旧日志用gzip压缩,如果日志为空就不创建新文件,轮转结束后重启应用让Node进程重新打开文件句柄。
3. 测试配置
手动触发一次轮转,看看配置有没有写对:
sudo logrotate -f /etc/logrotate.d/nodejs
之后日志会按/var/log/nodejs/application-2025-11-11.log.gz这样的格式自动归档,保留7天,干净利落。
二、使用PM2进程管理器(适合生产环境)
如果你已经在用PM2管理Node.js进程,那它的内置日志管理功能值得好好利用。PM2不仅能实时查看日志,还支持轮转、远程存储,甚至能配合ecosystem.config.js做精细控制。
1. 安装PM2
sudo npm install pm2 -g
2. 启动应用并配置日志
pm2 start app.js --name "my-app" \
--log /var/log/nodejs/my-app.log \
--error /var/log/nodejs/my-app-error.log
3. 日志管理命令
- 实时查看日志:
pm2 logs my-app(按Ctrl+C退出) - 查看最近100行:
pm2 logs my-app --lines 100 - 导出日志到文件:
pm2 logs my-app > my-app.log
4. 配置日志轮转
推荐在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',
log_rotation: {
interval: '1d',
size: '10M',
retain: 7
}
}]
};
启动时直接用pm2 start ecosystem.config.js,PM2就会按你设定的规则自动轮转,不需要额外安装任何轮转工具。
三、使用Winston日志库(应用层控制)
当你的日志需求不仅仅是“转一转、压一压”,还希望按级别分流、输出JSON格式方便ELK分析、甚至把错误日志发送到远程数据库时,就该让Winston上场了。它是Node.js生态里最流行的结构化日志库之一,配合winston-daily-rotate-file插件可以轻松实现按天轮转。
1. 安装依赖
npm install winston winston-daily-rotate-file
2. 配置日志轮转
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.json()
),
transports: [
new DailyRotateFile({
filename: '/var/log/nodejs/error-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
}),
new DailyRotateFile({
filename: '/var/log/nodejs/combined-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
}),
process.env.NODE_ENV !== 'production' ? new winston.transports.Console({
format: winston.format.simple()
}) : null
].filter(Boolean)
});
// 使用示例
logger.info('Application started');
logger.error('Database connection failed');
3. 高级配置(可选)
- 添加自定义传输:比如用
winston-elasticsearch把日志直接推送到Elasticsearch。 - 动态调整日志级别:通过
logger.level = 'debug'即可实时切换。
四、使用Pino高性能日志库(适合高并发场景)
如果你的应用每秒处理数千次请求,日志库的性能就不能忽视。Pino的吞吐量比Winston高5倍以上,典型延迟只有几微秒。它默认输出JSON格式,天然适合被ELK、Splunk这类工具消费。
1. 安装依赖
npm install pino pino-pretty pino-daily-rotate-file
2. 配置日志轮转
const pino = require('pino');
const pinoRotate = require('pino-rotate');
const logger = pino({
level: 'info',
transport: {
target: 'pino-rotate',
options: {
period: '1d',
path: '/var/log/nodejs/pino.log',
maxsize: '10m',
maxfiles: '7d',
gzip: true
}
}
}, pinoPretty({
colorize: true,
translateTime: 'SYS:standard'
}));
// 使用示例
logger.info('User logged in', { userId: 123 });
logger.error('Invalid request', { statusCode: 400 });
3. 特点
- 高性能:延迟低、吞吐量高,适合高并发。
- 低开销:JSON格式输出,日志解析几乎不占CPU。
五、自定义日志分割(高级用法)
如果所有工具都不能满足你特殊的“手工癖”,也可以用fs模块手写一个日志轮转器。不过说实话,除非只是临时调试一个简单的脚本,否则不推荐在生产环境这么干——代码量和维护成本比直接用工具高不少。
示例代码
const fs = require('fs');
const path = require('path');
const moment = require('moment');
const logDir = '/var/log/nodejs';
const logFile = path.join(logDir, 'application.log');
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir, { recursive: true });
}
function rotateLogs() {
const now = moment();
const rotatedFile = path.join(logDir, `application-${now.format('YYYY-MM-DD')}.log`);
if (fs.existsSync(logFile)) {
fs.renameSync(logFile, rotatedFile);
}
fs.writeFileSync(logFile, `Log rotated at ${now.format('YYYY-MM-DD HH:mm:ss')}\n`);
}
setInterval(rotateLogs, 24 * 60 * 60 * 1000);
rotateLogs();
注意事项
- 需要自己处理压缩、删除旧日志(比如通过
child_process.exec调用gzip和rm)。 - 生产环境不推荐,还是建议用
logrotate或成熟的日志库。
总结
- 简单场景:
logrotate就够了,不用改应用代码,稳定省心。 - 生产环境:PM2内置了日志管理和轮转,如果已经在用PM2,优先用它。
- 自定义需求:Winston或Pino,前者生态丰富,后者性能极致。
- 高并发场景:Pino是当之无愧的第一选择。
根据应用规模、性能要求和团队习惯,选最顺手的那条路就行。日志管理不需要追求“最炫酷”的方案,稳定、可靠、能快速定位问题,才是最终目的。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















