una saber rastreo rastrear rastreador rastrea pagina localizar informaticos informacion fisica exacta direccion datos como ruby-on-rails-3 devise

ruby on rails 3 - saber - Una forma eficiente de rastrear las fechas de inicio de sesión de los usuarios y el historial de direcciones IP



rastrear pagina web (7)

Aquí hay un ejemplo (scribd_analytics)

create_table ''page_views'' do |t| t.column ''user_id'', :integer t.column ''request_url'', :string, :limit => 200 t.column ''session'', :string, :limit => 32 t.column ''ip_address'', :string, :limit => 16 t.column ''referer'', :string, :limit => 200 t.column ''user_agent'', :string, :limit => 200 t.column ''created_at'', :timestamp end

Agregue un montón de índices, dependiendo de las consultas

Crea un PageView en cada solicitud

Usamos una consulta SQL construida a mano para extraer la sobrecarga de ActiveRecord en este

Podría probar la inserción de MySQL con retraso

Las consultas de Analytics suelen codificarse a mano en SQL

Use ''explicar selección'' para asegurarse de que MySQL utiliza los índices que espera

Escala bastante bien

PERO las consultas analíticas son costosas, pueden obstruir el servidor principal de la base de datos

Nuestra solución:

use two DB servers in a master/slave setup move all the analytics queries to the slave

http://www.scribd.com/doc/49575/Scaling-Rails-Presentation-From-Scribd-Launch

Otra opción para verificar es Gattica con Google Analytics

Intento rastrear el historial de inicio de sesión del usuario para fines estadísticos, pero no está claro para mí cuál sería la mejor manera de hacerlo. Podría tener una tabla separada que registre los usuarios y sus estadísticas de inicio de sesión con una fecha, pero esa tabla podría ponerse REALMENTE grande. Podría rastrear algunos campos históricos en el modelo / objeto del usuario en un campo analizable y simplemente actualizarlo (ellos) con algún formato de cadena delimitado. por ejemplo, dividir en:, obtener el último, si un código de fecha incluido no es hoy, agregar un elemento (fecha + recuento) de lo contrario aumentar, luego guardarlo de nuevo. Al menos con este segundo enfoque, sería fácil eliminar elementos antiguos (por ejemplo, solo mantener 30 días de inicios de sesión diarios o direcciones IP), ya que una tabla separada requeriría una tarea para eliminar registros antiguos.

Soy un gran fan de los cambios instantáneos. Las tareas son útiles, pero pueden complicar las cosas por razones de mantenimiento.

¿Alguien tiene alguna sugerencia? Aún no tengo una solución de almacenamiento en caché de datos externa ni nada. ¡Cualquier apuntador también es bienvenido! (He estado buscando preguntas y respuestas similares)

¡Gracias!


Hay una buena manera de hacerlo a través de Devise.

Warden configura un gancho llamado after_set_user que se ejecuta después de configurar un usuario. Entonces, suponiendo que tiene un Login modelo que contiene un campo ip, un campo logged_in_at y un campo user_id, solo puede crear el registro usando estos campos.

Warden::Manager.after_set_user :except => :fetch do |record, warden, options| Login.create!(:ip => warden.request.ip, :logged_in_at => Time.now, :user_id => record.id) end


Odio responder mis propias preguntas, especialmente dado que ambos dieron respuestas útiles. Creo que responder mi pregunta con el enfoque que tomé podría ayudar a otros, en combinación con sus respuestas.

He estado jugando con la gema impresionista (la única gema de vista de página útil desde el RailStat abandonado) con buenos resultados hasta ahora. Después de configurar la migración básica, descubrí que el uso esperado sigue muy de cerca el diseño MVC de Rail. Si agrega "impresionista" a un Controlador, buscará el Modelo al iniciar sesión en la vista de página. Puede modificar este comportamiento o simplemente llamar al impresionista usted mismo en su Controlador (o en cualquier lugar realmente) si es como yo y lo está probando en un Controlador que no tiene un Modelo.

De todos modos, lo conseguí trabajando con Devise para rastrear los inicios de sesión exitosos anulando el Devise :: SessionsController y simplemente llamando al método impresionista para el @current_member: (¡no olvides comprobar si es nulo! En el inicio de sesión fallido)

class TestSessionController < Devise::SessionsController def create if not @current_member.nil? impressionist(@current_member) end super end end

Agregarlo a otras partes del sitio más tarde para algunos análisis limitados es fácil de hacer. La única otra cosa que tuve que hacer fue actualizar mis rutas para usar el nuevo TestSessionController para la ruta de inicio de sesión de Devise:

post ''login'' => ''test_session#create'', :as => :member_session

Devise funciona de forma normal sin tener que modificar Devise de todos modos, y mi tabla de DB impresionista se indexa y registra los inicios de sesión. Solo necesitaré una tarea de rastrillo más tarde para recortarla semanalmente más o menos.

Ahora solo necesito averiguar cómo registrar inicios de sesión diarios sin tener que escribir un montón de bucles, consultas sucias ...


Si tiene el módulo: trackable, encontré esto de la manera más fácil. En el modelo de Usuario (o en cualquier modelo que esté autenticando)

def update_tracked_fields!(request) old_signin = self.last_sign_in_at super if self.last_sign_in_at != old_signin Audit.create :user => self, :action => "login", :ip => self.last_sign_in_ip end end

(Inspirado por https://github.com/plataformatec/devise/wiki/How-To:-Turn-off-trackable-for-admin-users )



Devise admite el seguimiento de la última fecha de inicio de sesión y la última dirección IP registrada con su :trackable módulo :trackable . Al agregar este módulo a su modelo de usuario, y luego también agregar los campos correctos a su base de datos, que son:

:sign_in_count, :type => Integer, :default => 0 :current_sign_in_at, :type => Time :last_sign_in_at, :type => Time :current_sign_in_ip, :type => String :last_sign_in_ip, :type => String

A continuación, puede anular el Devise::SessionsController y create acción para guardar el :last_sign_in_at y :last_sign_in_ip en una tabla separada en una before_create llamada before_create . Debería poder mantenerlos el tiempo que desee.


Basándose en la respuesta de @ user208769 , el núcleo Devise::Models::Trackable#update_tracked_fields! método ahora llama a un método auxiliar llamado update_tracked_fields antes de guardar. Eso significa que puede usar ActiveRecord::Dirty helpers para hacerlo un poco más simple:

def update_tracked_fields(request) super if last_sign_in_at_changed? Audit.create(user: self, action: ''login'', ip: last_sign_in_ip) end end

Esto puede simplificarse aún más (y ser más confiable si se validan) si las audits son una relación en su modelo:

def update_tracked_fields(request) super audits.build(action: ''login'', ip: last_sign_in_ip) if last_sign_in_at_changed? end