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最流行的日志库,支持多传输(控制台、文件、远程服务器等)、日志级别和格式化。
npm install winstonlogger.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}: ${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('Something went wrong!');优点:功能全面,支持日志分级、格式化和多目标输出,适合复杂应用。
Morgan专门用于记录HTTP请求日志,适合Express/Koa等框架,可将请求信息输出到文件或控制台。
npm install morganconst express = require('express');const morgan = require('morgan');const fs = require('fs');const path = require('path');const app = express();const port = 3000;// 创建写入流(输出到access.log文件)const accessLogStream = fs.createWriteStream(path.join(__dirname, 'logs/access.log'), { flags: 'a' });// 使用morgan中间件,格式为'combined'(Apache标准格式)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请求日志,格式规范,便于分析请求流量和性能。
当日志文件过大时,需通过轮转压缩旧日志,节省存储空间。常用winston-daily-rotate-file库实现每日轮转。
npm install winston-daily-rotate-filelogger.js):const { createLogger, format, transports } = require('winston');const DailyRotateFile = require('winston-daily-rotate-file');const logger = createLogger({level: 'info',format: format.combine(format.timestamp(),format.json()),transports: [new DailyRotateFile({ // 每日轮转filename: 'logs/application-%DATE%.log',datePattern: 'YYYY-MM-DD',zippedArchive: true, // 压缩旧日志maxSize: '20m', // 单个日志文件最大20MBmaxFiles: '14d' // 保留14天日志}),new transports.Console()]});module.exports = logger;优点:自动化管理日志文件,避免磁盘空间耗尽。
PM2是Node.js进程管理工具,可自动重启应用并提供日志管理功能,适合生产环境部署。
npm install pm2 -g# 启动应用(名称为my-app)pm2 start app.js --name my-app# 查看实时日志pm2 logs my-app# 查看特定日志文件pm2 logs my-app --lines 100 # 查看最近100行# 配置日志轮转(限制文件大小和保留数量)pm2 set pm2-logrotate:max_size 10M # 单个文件最大10MBpm2 set pm2-logrotate:retain 7 # 保留7天日志优点:无需手动管理进程和日志,支持日志分割、压缩和远程存储,提升应用稳定性。
通过环境变量动态调整日志级别,适应不同环境(开发/测试/生产)的需求。
# 开发环境(显示debug日志)LOG_LEVEL=debug node app.js# 生产环境(仅显示error和info日志)LOG_LEVEL=info node app.jsconst logger = createLogger({level: process.env.LOG_LEVEL || 'info', // 默认info级别// ...其他配置});优点:无需修改代码即可调整日志输出,提升灵活性。