在 Ubuntu 上使用 Node.js 自定义日志格式,可以通过多种方式实现。以下介绍几种常用的方法,包括使用内置的 console
模块、流行的日志库(如 winston
和 morgan
),以及如何配置日志输出格式。
console
模块Node.js 提供了内置的 console
模块,可以用于基本的日志记录。虽然它的自定义能力有限,但通过组合不同的参数和方法,可以实现一定程度的格式化。
const fs = require('fs');
// 创建一个可写流,指向日志文件
const accessLogStream = fs.createWriteStream('/var/log/myapp/access.log', { flags: 'a' });
// 自定义日志格式
function logCustom(format, ...args) {
const timestamp = new Date().toISOString();
const message = args.map(arg => {
if (typeof arg === 'object') {
try {
return JSON.stringify(arg);
} catch (error) {
return arg;
}
}
return arg;
}).join(' ');
const logEntry = `${timestamp} [MYAPP] ${format}\n`;
accessLogStream.write(logEntry);
}
// 使用自定义日志函数
logCustom('请求来自 %s,状态码 %d', '192.168.1.1', 200);
logCustom('错误: %o', { error: '文件未找到' });
accessLogStream.end();
new Date().toISOString()
生成标准格式的时间戳。[MYAPP]
作为标识,可以根据需要修改或扩展为不同的日志级别(如 INFO, ERROR)。args.map
处理每个参数,支持对象并尝试将其转换为 JSON 字符串,以便更好地展示结构化数据。winston
日志库winston
是一个功能强大且灵活的日志库,支持多种传输方式和自定义格式。
winston
npm install winston
const winston = require('winston');
// 创建自定义格式
const customFormat = winston.format.combine(
winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss'
}),
winston.format.printf(({ timestamp, level, message }) => {
return `[${timestamp}] [${level.toUpperCase()}] ${message}`;
})
);
// 创建 logger 实例
const logger = winston.createLogger({
level: 'info',
format: customFormat,
transports: [
new winston.transports.File({ filename: '/var/log/myapp/error.log', level: 'error' }),
new winston.transports.File({ filename: '/var/log/myapp/combined.log' })
]
});
// 使用 logger
logger.info('这是一条信息日志');
logger.warn('这是一条警告日志');
logger.error('这是一条错误日志');
winston.format.combine
和 winston.format.printf
来定义日志的输出格式,包括时间戳、日志级别和消息内容。transports
定义了日志的输出目标,这里同时输出到 error.log
和 combined.log
,并根据日志级别过滤。winston
支持多种传输方式(如控制台、文件、HTTP、Rotating File 等)和丰富的格式化选项,可以根据需求进行高度定制。morgan
中间件(适用于 Express 应用)如果你的 Node.js 应用是基于 Express 框架的,可以使用 morgan
中间件来记录 HTTP 请求日志,并自定义日志格式。
morgan
npm install morgan
const express = require('express');
const morgan = require('morgan');
const fs = require('fs');
const path = require('path');
const app = express();
// 创建自定义日志格式
morgan.token('customFormat', (req, res) => {
return `${req.method} ${req.url} ${res.statusCode} ${req.ip} - ${req.userAgent}`;
});
const morganFormat = ':customFormat';
// 如果在生产环境下,使用自定义的日志文件
if (process.env.NODE_ENV === 'production') {
const accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flags: 'a' });
app.use(morgan(morganFormat, { stream: accessLogStream }));
} else {
app.use(morgan(morganFormat));
}
// 示例路由
app.get('/', (req, res) => {
res.send('Hello World!');
});
// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`服务器运行在端口 ${PORT}`);
});
morgan.token
方法定义一个新的日志格式项 customFormat
,包含请求方法、URL、状态码、IP 地址和用户代理等信息。access.log
文件中;开发环境下则输出到控制台。morgan
提供了多种预定义的格式,也可以通过自定义 Token 实现更复杂的日志格式。log4js
进行高级日志管理log4js
是另一个功能丰富的日志库,支持多级别日志、日志轮转、不同的输出目标等。
log4js
npm install log4js
const log4js = require('log4js');
log4js.configure({
appenders: {
fileAppender: { type: 'file', filename: '/var/log/myapp/app.log' },
consoleAppender: { type: 'console' }
},
categories: {
default: { appenders: ['fileAppender', 'consoleAppender'], level: 'info' }
}
});
const logger = log4js.getLogger();
// 自定义布局
logger.layout = function(config) {
return `${config.timestamp} [${config.level}] ${config.data}`;
};
// 使用 logger
logger.info('这是一条信息日志');
logger.error('这是一条错误日志');
log4js.configure
定义日志的输出目标和类别。logger.layout
函数来自定义日志的输出格式,包括时间戳、日志级别和消息内容。在 Ubuntu 上使用 Node.js 自定义日志格式,可以根据项目的复杂程度和需求选择合适的方法:
console
模块,通过组合字符串和参数实现基本格式化。winston
或 log4js
等第三方日志库,支持丰富的格式化和多种传输方式。morgan
中间件快速实现 HTTP 请求日志的自定义格式。选择合适的工具和方法,可以有效地管理和监控 Node.js 应用的日志,提升开发和运维效率。