Class: Dbviewer::Query::Logger
- Inherits:
-
Object
- Object
- Dbviewer::Query::Logger
- Extended by:
- Forwardable
- Includes:
- Singleton
- Defined in:
- lib/dbviewer/query/logger.rb
Overview
Logger captures and analyzes SQL queries for debugging and performance monitoring
Class Method Summary collapse
-
.configure(enable_query_logging: true, query_logging_mode: :memory) ⇒ Object
Configure the singleton instance.
-
.log_security_event(event_type:, query_type:, sql:, timestamp:) ⇒ Object
Log security events for monitoring and auditing.
Instance Method Summary collapse
-
#add(event) ⇒ Object
Add a new SQL event query to the logger.
-
#add_security_event(event) ⇒ Object
Add a security event to the logger.
-
#clear ⇒ Object
Clear all stored queries.
-
#configure(enable_query_logging: true, query_logging_mode: :memory) ⇒ Object
Configure the logger with settings.
-
#initialize ⇒ Logger
constructor
A new instance of Logger.
-
#recent_queries(limit: 100, table_filter: nil, request_id: nil, min_duration: nil) ⇒ Object
Get recent queries, optionally filtered.
-
#recent_security_events(limit: 100) ⇒ Object
Get recent security events.
-
#stats ⇒ Object
Get stats about all queries.
-
#stats_for_queries(queries) ⇒ Object
Calculate stats for a specific set of queries (can be filtered).
Constructor Details
#initialize ⇒ Logger
Returns a new instance of Logger.
10 11 12 13 14 15 16 |
# File 'lib/dbviewer/query/logger.rb', line 10 def initialize # Initialize with default values, will be configured later @enable_query_logging = true @query_logging_mode = :memory set_storage Rails.logger.info("[DBViewer] QueryLogger initialized with #{mode} storage mode") end |
Class Method Details
.configure(enable_query_logging: true, query_logging_mode: :memory) ⇒ Object
Configure the singleton instance
100 101 102 103 104 105 |
# File 'lib/dbviewer/query/logger.rb', line 100 def configure(enable_query_logging: true, query_logging_mode: :memory) instance.configure( enable_query_logging: enable_query_logging, query_logging_mode: query_logging_mode ) end |
.log_security_event(event_type:, query_type:, sql:, timestamp:) ⇒ Object
Log security events for monitoring and auditing
112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/dbviewer/query/logger.rb', line 112 def log_security_event(event_type:, query_type:, sql:, timestamp:) # Log to Rails logger with security prefix for easy filtering Rails.logger.info("[DBViewer][Security] #{event_type.upcase}: #{query_type} - #{sql.truncate(200)}") # Also store in memory for potential analysis instance.add_security_event({ event_type: event_type, query_type: query_type, sql: sql, timestamp: , request_id: ActiveSupport::Notifications.instrumenter.id, thread_id: Thread.current.object_id.to_s }) end |
Instance Method Details
#add(event) ⇒ Object
Add a new SQL event query to the logger
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/dbviewer/query/logger.rb', line 32 def add(event) # Return early if query logging is disabled return unless @enable_query_logging return if ::Dbviewer::Query::Parser.should_skip_query?(event) || ::Dbviewer::Query::Parser.should_skip_internal_query?(event) current_time = Time.now @storage.add({ sql: event.payload[:sql], name: event.payload[:name], timestamp: current_time, duration_ms: event.duration.round(2), binds: ::Dbviewer::Query::Parser.format_binds(event.payload[:binds]), request_id: ActiveSupport::Notifications.instrumenter.id, thread_id: Thread.current.object_id.to_s, caller: event.payload[:caller] }) end |
#add_security_event(event) ⇒ Object
Add a security event to the logger
76 77 78 79 80 81 82 83 |
# File 'lib/dbviewer/query/logger.rb', line 76 def add_security_event(event) # Store security events separately for analysis @security_events ||= [] @security_events << event # Keep only the last 1000 security events to prevent memory issues @security_events = @security_events.last(1000) if @security_events.size > 1000 end |
#clear ⇒ Object
Clear all stored queries
51 52 53 |
# File 'lib/dbviewer/query/logger.rb', line 51 def clear @storage.clear end |
#configure(enable_query_logging: true, query_logging_mode: :memory) ⇒ Object
Configure the logger with settings
21 22 23 24 25 26 27 28 29 |
# File 'lib/dbviewer/query/logger.rb', line 21 def configure(enable_query_logging: true, query_logging_mode: :memory) @enable_query_logging = enable_query_logging @query_logging_mode = query_logging_mode # Reinitialize storage if mode changed @storage = nil @mode = nil set_storage Rails.logger.info("[DBViewer] QueryLogger configured with #{mode} storage mode") end |
#recent_queries(limit: 100, table_filter: nil, request_id: nil, min_duration: nil) ⇒ Object
Get recent queries, optionally filtered
56 57 58 59 60 61 62 63 |
# File 'lib/dbviewer/query/logger.rb', line 56 def recent_queries(limit: 100, table_filter: nil, request_id: nil, min_duration: nil) @storage.filter( limit: limit, table_filter: table_filter, request_id: request_id, min_duration: min_duration ) end |
#recent_security_events(limit: 100) ⇒ Object
Get recent security events
86 87 88 89 |
# File 'lib/dbviewer/query/logger.rb', line 86 def recent_security_events(limit: 100) @security_events ||= [] @security_events.last(limit) end |
#stats ⇒ Object
Get stats about all queries
66 67 68 |
# File 'lib/dbviewer/query/logger.rb', line 66 def stats stats_for_queries(@storage.all) end |
#stats_for_queries(queries) ⇒ Object
Calculate stats for a specific set of queries (can be filtered)
71 72 73 |
# File 'lib/dbviewer/query/logger.rb', line 71 def stats_for_queries(queries) Analyzer.generate_stats(queries) end |