requestLog.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. const path = require('path')
  2. const db = require("../plugin/DataBase/db")
  3. const Logger = require('./Logger')
  4. const ipSearcher = require('../plugin/ip2region')
  5. class RequestLog {
  6. constructor() {
  7. this.logger = new Logger()
  8. this.searcher = ipSearcher.newWithFileOnly(path.join(__dirname, '../plugin/ip2region/ip2region.xdb'))
  9. }
  10. async insertLog(req, res, namespace, method, path) {
  11. try {
  12. const time = new Date().getTime()
  13. const ip = this.getClientIp(req)
  14. let ipData = await this.searcher.search(ip)
  15. ipData = ipData.region
  16. const userAgent = req.headers['user-agent']
  17. const deviceType = req.headers['device-type'] ?? '浏览器'
  18. let reqData
  19. if (method === 'get') {
  20. reqData = req.query
  21. } else {
  22. reqData = req.body
  23. }
  24. let sql = 'INSERT INTO requestLog (create_user, create_time, method, reqData, code, ip, ua, deviceType, apiName, location, url) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
  25. let r = await db.query(sql, [reqData.uuid ?? '', time, method, reqData, res.code, ip, userAgent, deviceType, namespace ?? '未知', ipData ?? '未知', path])
  26. if (!r || r.affectedRows !== 1)
  27. this.logger.error(`插入日志信息失败!数据库错误`)
  28. } catch (error) {
  29. this.logger.error(`插入日志信息失败!${error}`)
  30. }
  31. }
  32. getClientIp(req) {
  33. let ip = null;
  34. if (req.headers['x-forwarded-for']) {
  35. ip = req.headers['x-forwarded-for'].split(',')[0].trim();
  36. } else if (req.headers['x-real-ip']) {
  37. ip = req.headers['x-real-ip'];
  38. } else {
  39. ip = req.connection.remoteAddress || '';
  40. }
  41. // 如果是 IPv6 映射的 IPv4 (::ffff:x.x.x.x),提取后面的 IPv4
  42. if (ip.startsWith("::ffff:")) {
  43. ip = ip.replace("::ffff:", "");
  44. }
  45. // 如果是 [::1] 或其他 IPv6,可以按需过滤掉
  46. const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}$/;
  47. if (!ipv4Regex.test(ip)) {
  48. return null; // 非 IPv4 返回 null 或者你可以保留原值
  49. }
  50. return ip;
  51. }
  52. }
  53. module.exports = RequestLog