Ubuntu下配置Node.js日志的常见方法
1. 使用内置console.log(开发调试首选)
console.log是Node.js原生支持的日志方法,适合快速输出简单日志,无需额外依赖。
示例代码:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
console.log(`[${new Date().toISOString()}] INFO: Request received at ${req.url}`); // 自定义格式
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`[${new Date().toISOString()}] INFO: Server running at http://localhost:${port}/`);
});
特点:简单易用,但无法灵活控制日志级别、格式或持久化存储,仅适合开发阶段临时使用。
2. 使用第三方日志库(推荐生产环境)
Winston(功能全面)
Winston是Node.js最流行的日志库之一,支持多传输(控制台、文件、HTTP等)、自定义格式、日志级别(info/warn/error等)。
安装:
npm install winston
配置示例(logger.js):
const { createLogger, format, transports } = require('winston');
const logger = createLogger({
level: process.env.LOG_LEVEL || 'info', // 通过环境变量动态设置日志级别
format: format.combine(
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), // 时间戳
format.printf(({ timestamp, level, message }) => `[${timestamp}] ${level.toUpperCase()}: ${message}`) // 自定义输出格式
),
transports: [
new transports.Console(), // 控制台输出(开发环境)
new transports.File({ filename: 'logs/error.log', level: 'error' }), // 错误日志单独存储
new transports.File({ filename: 'logs/combined.log' }) // 所有日志合并存储
]
});
// 开发环境添加控制台输出(带简单格式)
if (process.env.NODE_ENV !== 'production') {
logger.add(new transports.Console({ format: format.simple() }));
}
module.exports = logger;
使用示例:
const logger = require('./logger');
logger.info('Application started');
logger.error('Database connection failed');
特点:灵活可扩展,支持日志分级、持久化和自定义格式,适合生产环境。
Morgan(HTTP请求日志中间件)
Morgan专门用于记录HTTP请求日志,适合Express/Koa等框架,能快速捕获请求方法、URL、状态码等信息。
安装:
npm install morgan
配置示例:
const express = require('express');
const morgan = require('morgan');
const fs = require('fs');
const path = require('path');
const app = express();
const port = 3000;
// 创建日志文件流(追加模式)
const accessLogStream = fs.createWriteStream(path.join(__dirname, 'logs/access.log'), { flags: 'a' });
// 使用morgan中间件(combined格式包含详细请求信息)
app.use(morgan('combined', { stream: accessLogStream }));
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
特点:专注于HTTP请求日志,输出格式规范(如Apache combined格式),便于后续分析访问趋势。
3. 日志轮转(防止日志过大)
当日志文件持续增长时,需通过轮转策略分割日志,避免占用过多磁盘空间。常用工具为winston-daily-rotate-file(Winston扩展)或系统级logrotate。
Winston-Daily-Rotate-File(推荐)
安装:
npm install winston-daily-rotate-file
配置示例(替换Winston的File传输):
const { createLogger, format, transports } = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = createLogger({
level: 'info',
format: format.combine(
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
format.printf(({ timestamp, level, message }) => `[${timestamp}] ${level.toUpperCase()}: ${message}`)
),
transports: [
new DailyRotateFile({
filename: 'logs/application-%DATE%.log', // 日志文件名模板(%DATE%为日期占位符)
datePattern: 'YYYY-MM-DD', // 按天轮转
zippedArchive: true, // 压缩旧日志(节省空间)
maxSize: '20m', // 单个日志文件最大20MB
maxFiles: '14d' // 保留14天内的日志
})
]
});
module.exports = logger;
特点:自动化管理日志文件,支持按时间/大小分割、压缩和过期清理,无需手动干预。
System Logrotate(系统级工具)
若不想修改代码,可通过Ubuntu自带的logrotate工具管理日志文件。
配置步骤:
- 创建Logrotate配置文件:
sudo nano /etc/logrotate.d/nodejs - 添加以下内容(替换
/path/to/your/nodejs/logs/*.log为实际日志路径):/path/to/your/nodejs/logs/*.log { daily # 每天轮转 missingok # 忽略缺失文件 rotate 7 # 保留7天内的日志 compress # 压缩旧日志(gzip) notifempty # 空日志不轮转 create 0640 root adm # 新日志文件权限 } - 测试配置是否生效:
sudo logrotate -vf /etc/logrotate.d/nodejs
特点:系统级工具,无需修改应用代码,适合统一管理多个应用的日志。
4. 使用PM2进行进程管理与日志管理(生产环境必备)
PM2是Node.js进程管理器,能自动重启崩溃的应用、监控资源占用,并提供日志管理功能(集中存储、实时查看、轮转)。
安装:
npm install pm2 -g
启动应用并管理日志:
# 启动应用(--name指定应用名称)
pm2 start app.js --name my-node-app
# 查看实时日志(默认输出到~/.pm2/logs/目录)
pm2 logs my-node-app
# 查看特定日志文件
pm2 logs my-node-app --lines 100 # 查看最近100行
# 配置日志轮转(限制单个日志文件大小为10MB,保留7份)
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
特点:一站式解决进程管理和日志问题,支持集群模式、日志持久化和远程查看,适合生产环境。
5. 通过环境变量动态配置日志级别
为了适应不同环境(开发/测试/生产)的需求,可通过环境变量动态调整日志级别,避免修改代码。
示例:
// logger.js(Winston配置)
const logger = createLogger({
level: process.env.LOG_LEVEL || 'info', // 优先使用环境变量,未设置则默认为info
// ...其他配置
});
启动应用时设置环境变量:
# 开发环境(显示debug日志)
LOG_LEVEL=debug node app.js
# 生产环境(仅显示error和info日志)
LOG_LEVEL=info pm2 start app.js --name my-node-app
特点:灵活控制日志输出粒度,无需修改代码即可适配不同环境。
以上就是关于“Ubuntu下如何配置Node日志”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm