ubuntu

如何在Ubuntu Nodejs中自定义日志格式

小樊
44
2025-05-13 08:38:53
栏目: 编程语言

在 Ubuntu 上使用 Node.js 自定义日志格式,可以通过多种方式实现。以下介绍几种常用的方法,包括使用内置的 console 模块、流行的日志库(如 winstonmorgan),以及如何配置日志输出格式。

方法一:使用 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();

说明

方法二:使用 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('这是一条错误日志');

说明

方法三:使用 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}`);
});

说明

方法四:结合 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('这是一条错误日志');

说明

总结

在 Ubuntu 上使用 Node.js 自定义日志格式,可以根据项目的复杂程度和需求选择合适的方法:

选择合适的工具和方法,可以有效地管理和监控 Node.js 应用的日志,提升开发和运维效率。

0
看了该问题的人还看了