在 Ubuntu 上使用 Node.js 自定义日志格式,可以通过多种方式实现。以下介绍几种常用的方法,包括使用内置的 console 模块、流行的日志库(如 winston 和 morgan),以及如何配置日志输出格式。
方法一:使用 Node.js 内置的 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}`);
});
说明
- 自定义 Token:通过
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等第三方日志库,支持丰富的格式化和多种传输方式。 - Express 应用:使用
morgan中间件快速实现 HTTP 请求日志的自定义格式。
选择合适的工具和方法,可以有效地管理和监控 Node.js 应用的日志,提升开发和运维效率。
以上就是关于“如何在Ubuntu Nodejs中自定义日志格式”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm