Node.js日志如何与数据库集成

119
2025/3/21 12:32:13
栏目: 编程语言
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

在Node.js中,将日志与数据库集成可以帮助你更好地存储、管理和分析日志数据。以下是一些常见的方法来实现Node.js日志与数据库的集成:

1. 使用Winston和MongoDB

Winston是一个流行的日志库,可以与MongoDB集成来存储日志数据。

安装依赖

npm install winston mongoose

配置Winston

const winston = require('winston');
const mongoose = require('mongoose');
const { MongoTransport } = require('winston-mongodb');

// 连接到MongoDB
mongoose.connect('mongodb://localhost:27017/logs', { useNewUrlParser: true, useUnifiedTopology: true });

// 定义日志模型
const LogSchema = new mongoose.Schema({
  level: String,
  message: String,
  timestamp: { type: Date, default: Date.now }
});

// 创建MongoDB传输
const mongoTransport = new MongoTransport({
  db: mongoose.connection.db,
  collection: 'logs'
});

// 配置Winston
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    mongoTransport
  ]
});

// 使用日志记录器
logger.info('Hello, world!');

2. 使用Morgan和MySQL

Morgan是一个HTTP请求日志中间件,可以与MySQL集成来存储请求日志。

安装依赖

npm install morgan mysql

配置Morgan

const express = require('express');
const morgan = require('morgan');
const mysql = require('mysql');

// 创建MySQL连接
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'user',
  password: 'password',
  database: 'logs'
});

connection.connect();

// 配置Morgan
morgan.token('response-time', (req, res) => {
  return res.headers['x-response-time'];
});

const morganFormat = ':method :url :status :res[content-length] - :response-time ms - :log';

app.use(morgan(morganFormat, {
  stream: {
    write: message => {
      const logEntry = message.trim();
      connection.query('INSERT INTO logs (method, url, status, response_time) VALUES (?, ?, ?, ?)', [logEntry.method, logEntry.url, logEntry.status, logEntry.response_time], (error, results) => {
        if (error) throw error;
      });
    }
  }
}));

app.get('/', (req, res) => {
  res.send('Hello, world!');
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

3. 使用Pino和PostgreSQL

Pino是一个高性能的日志库,可以与PostgreSQL集成来存储日志数据。

安装依赖

npm install pino pg

配置Pino

const pino = require('pino');
const { Pool } = require('pg');

// 创建PostgreSQL连接池
const pool = new Pool({
  user: 'user',
  host: 'localhost',
  database: 'logs',
  password: 'password',
  port: 5432,
});

// 配置Pino
const logger = pino({
  level: 'info',
  transport: {
    target: 'pino-pretty',
    options: {
      colorize: true
    }
  }
});

// 自定义传输器
class PgTransport {
  constructor(options) {
    this.pool = options.pool;
  }

  write(record, callback) {
    const { level, msg, timestamp } = record;
    this.pool.query('INSERT INTO logs (level, message, timestamp) VALUES ($1, $2, $3)', [level, msg, timestamp], (error, results) => {
      if (error) return callback(error);
      callback();
    });
  }
}

// 使用自定义传输器
logger.add(new PgTransport({ pool }));

// 使用日志记录器
logger.info('Hello, world!');

总结

以上示例展示了如何使用不同的日志库(Winston、Morgan、Pino)与不同的数据库(MongoDB、MySQL、PostgreSQL)集成。你可以根据自己的需求选择合适的日志库和数据库,并根据示例进行配置。

辰迅云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

推荐阅读: linux怎么创建utf8编码文件