在Ubuntu上对Node.js日志进行格式化,可根据需求选择不同工具和方法,以下是常用技巧:
console模块通过自定义函数实现基础格式化,适合简单场景:
const moment = require('moment');
function log(level, message) {
const timestamp = moment().format('YYYY-MM-DD HH:mm:ss');
const colors = { info: '\x1b[34m', warn: '\x1b[33m', error: '\x1b[31m' };
console.log(`${colors[level] || '\x1b[0m'}[${timestamp}] [${level.toUpperCase()}]: ${message}\x1b[0m`);
}
log('info', '这是一条信息日志');
说明:通过moment生成时间戳,用ANSI颜色码为不同日志级别添加颜色。
功能强大,支持多格式化和传输方式:
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.printf(({ timestamp, level, message }) =>
`[${timestamp}] [${level.toUpperCase()}]: ${message}`
)
),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'app.log' })
]
});
logger.info('这是一条信息日志');
说明:通过winston.format.combine组合时间戳和自定义消息格式,支持输出到控制台和文件。
专为HTTP请求设计,可自定义请求日志格式:
const express = require('express');
const morgan = require('morgan');
const app = express();
morgan.token('custom', (req, res) =>
`${req.method} ${req.url} ${res.statusCode} ${req.ip}`
);
app.use(morgan(':custom'));
app.get('/', (req, res) => res.send('Hello World!'));
说明:通过morgan.token定义请求方法、URL、状态码等字段,输出至控制台或文件。
高性能,支持JSON格式和结构化日志:
const pino = require('pino');
const logger = pino({
level: 'info',
formatters: {
level: (label) => ({ level: label.toUpperCase() })
}
});
logger.info({ user: 'Alice', action: 'login' });
说明:默认输出JSON格式,可通过formatters自定义字段格式,适合微服务场景。
支持多级日志和灵活配置:
const log4js = require('log4js');
log4js.configure({
appenders: {
out: { type: 'stdout', layout: { type: 'pattern', pattern: '%d{YYYY-MM-DD HH:mm:ss} [%p] %c - %m%n' } }
},
categories: { default: { appenders: ['out'], level: 'info' } }
});
const logger = log4js.getLogger();
logger.info('这是一条信息日志');
说明:通过pattern语法定义时间戳、日志级别等格式,支持文件和控制台输出。
logrotate工具定期归档日志,避免文件过大。winston-syslog或ELK Stack将日志发送至远程服务器,便于分析。process.env.NODE_ENV动态调整日志级别和格式,例如生产环境减少冗余信息。根据项目复杂度选择合适方案,简单场景优先使用内置模块或Winston,复杂应用可结合Morgan或Log4js。