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', // 单个日志文件最大20MB
maxFiles: '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 # 单个文件最大10MB
pm2 set pm2-logrotate:retain 7 # 保留7天日志
优点:无需手动管理进程和日志,支持日志分割、压缩和远程存储,提升应用稳定性。
通过环境变量动态调整日志级别,适应不同环境(开发/测试/生产)的需求。
# 开发环境(显示debug日志)
LOG_LEVEL=debug node app.js
# 生产环境(仅显示error和info日志)
LOG_LEVEL=info node app.js
const logger = createLogger({
level: process.env.LOG_LEVEL || 'info', // 默认info级别
// ...其他配置
});
优点:无需修改代码即可调整日志输出,提升灵活性。