Postgresql 世卫组织';有什么跟踪现场访问

Postgresql 世卫组织';有什么跟踪现场访问,postgresql,activerecord,logging,sinatra,Postgresql,Activerecord,Logging,Sinatra,我正在写一个与sinatra和heroku的网站,我想找到一种方法来跟踪每次访问我的网站。我看过实际的分析程序(例如),并选择不使用它们,因为我想自己学习如何使用它们 我对访问的定义: 当某人或某物(机器人)访问您的站点时,就会发生访问。它由一个或多个页面视图/点击组成。一个访问者可以多次访问您的站点 资料来源: 对于每次访问,我希望跟踪: 访客IP地址 访问开始时间(页面已打开) 访问结束时间(页面已关闭) 这个网站不经常浏览,所以我想把每次访问记录在一个使用activerecord访问的po

我正在写一个与sinatra和heroku的网站,我想找到一种方法来跟踪每次访问我的网站。我看过实际的分析程序(例如),并选择不使用它们,因为我想自己学习如何使用它们

我对访问的定义:

当某人或某物(机器人)访问您的站点时,就会发生访问。它由一个或多个页面视图/点击组成。一个访问者可以多次访问您的站点

资料来源:

对于每次访问,我希望跟踪:

  • 访客IP地址
  • 访问开始时间(页面已打开)
  • 访问结束时间(页面已关闭)
  • 这个网站不经常浏览,所以我想把每次访问记录在一个使用activerecord访问的postgres数据库中。 日志记录的工作方式如下:

  • 用户访问页面
  • 会话启动,
    ip
    mac\u地址
    时间
    查看id
    登录
    访问
  • 查看的每个页面都会登录到
    PageView
  • 用户关闭页面
  • 会话被清除,
    time
    view\u id
    被登录
    Visit
  • 数据库格式

    • 访问次数(表)
      • ip(列、字符串)
      • mac_地址(列、字符串)
      • 视图id(列,int)
      • 时间(列、日期时间)
    • 浏览量(表格)
      • 页面(列、字符串)
      • 时间(列、日期时间)
      • 视图id(列,int)
    迁移文件示例:

    class Main < ActiveRecord::Migration
      def change
        create_table :visits do |item|
            item.string :ip
            item.string :mac_address
            item.datetime :time
            item.int :visit_id
        end
        create_table :pageviews do |item|
            item.int :visit_id
            item.string :page
            item.datetime :time
      end
    end
    
    classmain
    对于每次访问,我希望跟踪:

  • 访客IP地址
  • 访问开始时间(页面已打开)
  • 访问结束时间(页面已关闭)
  • 你以前也有MAC地址在列表中,但只是重申一下——它们不用于路由互联网,只用于本地网络,因此保存这些信息几乎毫无意义,即使你可以找到它

    HTTP是一种无状态协议,这意味着#3不可能通过HTTP方法实现,但可以通过javascript实现。最简单的方法可能是以可接受的时间间隔进行投票,更新时间

    #1和#2已经被您的基本服务器日志捕获,它们将是我使用的-为什么重复工作但我将添加如何使用Sinatra通过模型来实现这一点

    如果在
    过滤器之前使用
    ,则可以轻松捕获#1和#2。有一些您想要的,您需要时间,并确保它是该ip的唯一用户:

    before do
      # this is pseudo code, Sequel style, you can work this bit out
      # for ActiveRecord
      user =
        if user_id = session[:user]
          User[user_id]
        else
          User.create
        end
    
      # you may want to check if there's an existing session for this page
      # as refreshes would run this again. It's up to you.
      user.add_visit Visit.create(page: request.path,ip: request.ip, start: Time.now.rfc2822])
      session[:analytics] = visit.id
      session[:user] = user.session_id # *don't* just bung the
                                       # user id in there
    end
    
    您需要一个路由来记录结束时间

    patch "/analytics", :provides => :json do
      visit_id = session[:analytics]
      user = User[ :session_id => session[:user] ]
      visit = user.visits.find(:id => visit_id)
      visit.end = Rack::Utils.rfc2822(params[:end])
      visit.save
      halt 204 # take your pick of success numbers
               # you should also check for errors
               # and check the input is valid
               # and you may want to return some JSON to the
               # calling javascript.
      # Also think about how to restrict access to this
      # route to only authorised callers. Since you're providing the
      # javascript, you can place variables in them by generating
      # parts on the fly and serving it via a Sinatra route etc.
    end
    
    我不打算编写javascript,这应该很简单


    注意,我基本上把这个代码从我的背面拉出来,所以考虑任何或者所有的代码都可能会损坏,而且是摇晃的,但是这就是你的想法。正如我上面提到的,我可能会删掉大部分内容,使用日志和一些明智的正则表达式。

    我认为,未经他的许可,您将无法获得任何客户端mac添加。扩展上述内容:mac地址是l(仅限),您无法在路由Internet上看到它。因此,我可以从客户端请求它吗?或者我应该从问题中删除它?你可以用javascript获取客户端的MAC地址,如果他们运行Windows并允许你安装ActiveX控件,请检查这个@authprivate谢谢,我已经将它添加到问题中。