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 特点:灵活控制日志输出粒度,无需修改代码即可适配不同环境。