Ubuntu下配置Node.js日志的常见方法
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}/`);
});
特点:简单易用,但无法灵活控制日志级别、格式或持久化存储,仅适合开发阶段临时使用。
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请求日志,适合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格式),便于后续分析访问趋势。
当日志文件持续增长时,需通过轮转策略分割日志,避免占用过多磁盘空间。常用工具为winston-daily-rotate-file
(Winston扩展)或系统级logrotate
。
安装:
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;
特点:自动化管理日志文件,支持按时间/大小分割、压缩和过期清理,无需手动干预。
若不想修改代码,可通过Ubuntu自带的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
特点:系统级工具,无需修改应用代码,适合统一管理多个应用的日志。
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
特点:一站式解决进程管理和日志问题,支持集群模式、日志持久化和远程查看,适合生产环境。
为了适应不同环境(开发/测试/生产)的需求,可通过环境变量动态调整日志级别,避免修改代码。
示例:
// 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
特点:灵活控制日志输出粒度,无需修改代码即可适配不同环境。