Nodejs 求一个访问统计模块,包括静态文件的访问统计,可以将日志存到sqlite或mongodb

Nodejs 求一个访问统计模块,包括静态文件的访问统计,可以将日志存到sqlite或mongodb

要每个url的访问次数(不管是不是静态文件) 如果能简单分析客户来源/地理位置的信息,统计实时在线人数,就更完美了。

第三统计如google/cnzz这些,不能统计静态文件的,求一个这样的开源项目。

5 回复

Node.js 访问统计模块

需求描述

我们希望实现一个访问统计模块,能够统计所有 URL 的访问次数,包括静态文件。同时,该模块需要支持将日志存储到 SQLite 或 MongoDB 数据库中,并且提供一些额外的功能,如分析客户来源、地理位置信息以及实时在线人数。

技术选型

  • 数据库:SQLite 和 MongoDB
  • 中间件:Express.js 作为 Web 框架
  • 地理定位:使用 geoip-lite 库来解析 IP 地址
  • 在线人数统计:使用 Redis 来记录在线用户

示例代码

  1. 安装依赖

    npm install express sqlite3 mongodb geoip-lite redis
    
  2. 基本配置 创建一个 Express 应用并初始化数据库连接。

    const express = require('express');
    const sqlite3 = require('sqlite3').verbose();
    const MongoClient = require('mongodb').MongoClient;
    const geoip = require('geoip-lite');
    const Redis = require('ioredis');
    
    const app = express();
    
    // 初始化数据库连接
    const dbSqlite = new sqlite3.Database('access-stats.db', (err) => {
      if (err) {
        console.error(err.message);
      }
      console.log('Connected to the access-stats database.');
    });
    
    const dbMongo = new MongoClient('mongodb://localhost:27017/', { useNewUrlParser: true, useUnifiedTopology: true });
    dbMongo.connect((err, client) => {
      if (err) {
        console.error(err.message);
      }
      console.log('Connected to MongoDB.');
    });
    
    const redis = new Redis();
    
  3. 中间件 - 访问统计 使用中间件来记录每次请求的详细信息。

    app.use((req, res, next) => {
      const ip = req.ip || req.connection.remoteAddress;
      const geo = geoip.lookup(ip);
      
      const logEntry = {
        url: req.url,
        method: req.method,
        ip,
        geo: geo ? { country: geo.country } : null,
        timestamp: Date.now()
      };
    
      // 存储到 SQLite
      dbSqlite.run(
        'INSERT INTO access_logs (url, method, ip, geo, timestamp) VALUES (?, ?, ?, ?, ?)',
        [logEntry.url, logEntry.method, logEntry.ip, JSON.stringify(logEntry.geo), logEntry.timestamp]
      );
    
      // 存储到 MongoDB
      dbMongo.collection('access_logs').insertOne(logEntry);
    
      // 更新在线人数
      redis.sadd('online-users', ip).then(() => {
        redis.expire('online-users', 60); // 1分钟过期
        redis.scard('online-users').then(count => {
          console.log(`Current online users: ${count}`);
        });
      });
    
      next();
    });
    
  4. 创建数据表 在 SQLite 中创建数据表。

    CREATE TABLE IF NOT EXISTS access_logs (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      url TEXT NOT NULL,
      method TEXT NOT NULL,
      ip TEXT NOT NULL,
      geo TEXT,
      timestamp INTEGER NOT NULL
    );
    
  5. 启动服务器

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

总结

以上代码展示了如何使用 Node.js 实现一个简单的访问统计模块。它记录了每个请求的详细信息(包括 URL、方法、IP 地址、地理位置等),并将这些信息存储到 SQLite 和 MongoDB 中。此外,还通过 Redis 维护了一个在线用户列表。你可以根据实际需求进一步扩展和完善这个模块。


继续求,或者有差不多的项目也可以

给Express加一个中间件,中间件里用log4js做Log,自己写个需要的Appender即可。 或者你也可以参考这里做:http://cnodejs.org/topic/5136ba7ddf9e9fcc582ba6e6。

我主要是想做访问日志,需要加上日志分析,比如说可以显示某个url某个时间访问了多少次,最好是可以对操作系统,地区,时间这些进行分析。

为了实现一个访问统计模块,包括静态文件的访问统计,并且能够将日志存储到SQLite或MongoDB中,我们可以使用Express框架以及相应的中间件。以下是一个基本的示例,展示如何实现这一功能。

示例代码

安装依赖

首先,你需要安装一些必要的依赖包:

npm install express sqlite3 mongodb morgan

配置和实现

  1. 创建一个简单的Express应用
const express = require('express');
const morgan = require('morgan');
const sqlite3 = require('sqlite3').verbose();
const MongoClient = require('mongodb').MongoClient;

const app = express();

// 使用morgan中间件来记录请求
app.use(morgan('combined', {
    stream: { write: message => logAccess(message) }
}));

// 假设使用SQLite作为数据库
let db = new sqlite3.Database(':memory:', (err) => {
    if (err) {
        console.error(err.message);
    }
    console.log('Connected to the in-memory SQLite database.');
});

// 创建表
db.run(`CREATE TABLE accessLog (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    url TEXT NOT NULL,
    timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
)`);

// MongoDB连接配置(假设使用MongoDB)
const uri = 'your_mongodb_connection_string';
let mongoDb;
MongoClient.connect(uri, function(err, client) {
    if (err) throw err;
    mongoDb = client.db('accessStats');
    console.log("Connected successfully to MongoDB");
});

// 访问日志处理函数
function logAccess(message) {
    const url = /"(GET|POST)\s(\S+)\sHTTP/.exec(message)[2];
    
    // 存储到SQLite
    db.run("INSERT INTO accessLog (url) VALUES (?)", [url], function(err) {
        if (err) throw err;
    });
    
    // 存储到MongoDB
    const accessLogCollection = mongoDb.collection('accessLog');
    accessLogCollection.insertOne({ url, timestamp: new Date() }, function(err, result) {
        if (err) throw err;
    });
}

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

// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

解释

  • Morgan中间件morgan 是一个HTTP请求日志中间件,可以用来记录每次请求的信息。
  • SQLite数据库:我们使用 sqlite3 来存储访问日志,这里创建了一个简单的内存数据库。
  • MongoDB数据库:同样地,我们也使用 mongodb 包来连接MongoDB并存储访问日志。
  • 日志处理函数logAccess 函数负责解析morgan的日志信息,并将URL插入到SQLite和MongoDB中。

这只是一个基本的实现示例,实际应用中可能需要增加更多的功能,比如实时在线人数统计、用户来源分析等。

回到顶部