Nodejs 求一个访问统计模块,包括静态文件的访问统计,可以将日志存到sqlite或mongodb
Nodejs 求一个访问统计模块,包括静态文件的访问统计,可以将日志存到sqlite或mongodb
要每个url的访问次数(不管是不是静态文件) 如果能简单分析客户来源/地理位置的信息,统计实时在线人数,就更完美了。
第三统计如google/cnzz这些,不能统计静态文件的,求一个这样的开源项目。
Node.js 访问统计模块
需求描述
我们希望实现一个访问统计模块,能够统计所有 URL 的访问次数,包括静态文件。同时,该模块需要支持将日志存储到 SQLite 或 MongoDB 数据库中,并且提供一些额外的功能,如分析客户来源、地理位置信息以及实时在线人数。
技术选型
- 数据库:SQLite 和 MongoDB
- 中间件:Express.js 作为 Web 框架
- 地理定位:使用
geoip-lite
库来解析 IP 地址 - 在线人数统计:使用 Redis 来记录在线用户
示例代码
-
安装依赖
npm install express sqlite3 mongodb geoip-lite redis
-
基本配置 创建一个 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();
-
中间件 - 访问统计 使用中间件来记录每次请求的详细信息。
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(); });
-
创建数据表 在 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 );
-
启动服务器
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
配置和实现
- 创建一个简单的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中。
这只是一个基本的实现示例,实际应用中可能需要增加更多的功能,比如实时在线人数统计、用户来源分析等。