ConsoleGuidesEvents

Events

This guide explains how to log structured events with a well-defined schema.

Overview

Logs often fall into two categories:

Events are a type of structured log which are designed to be machine-readable and have a well-defined schema. They are used to represent a specific occurrence within a system, such as a request, a response, an error, or a warning. You can create custom events to represent any structured data you like.

Core Concepts

Emitting Events

To emit an event, you can create an instance of a specific event class and call the #emit method. For example, to emit a failure event:

def handle_request
	begin
		# ... user code ...
	rescue => error
		Console::Event::Failure.for(error).emit(self, "Failed to handle request!")
	end
end

This will emit a failure event with the error message and backtrace.

Emitting Events with Different Severity Levels

Events can have different severity levels, such as :info, :warn, :error, and :fatal. You can specify the severity level when emitting an event:

Console::Event::Failure.for(error).emit(self, "Failed to handle request!", severity: :debug)

Custom Events

You can create custom events by subclassing class Console::Event::Generic and defining the schema for the event. For example, to create a custom event for tracking user logins:

class UserLoginEvent < Console::Event::Generic
	def self.for(request, user)
		self.new(user.id, request.ip)
	end
	
	def new(id, ip)
		@id = id
		@ip = ip
	end
	
	def to_hash
		{
			# Specifying a type field is recommended:
			type: :login,
			
			# Custom fields:
			id: @id,
			ip: @ip
		}
	end
end

UserLoginEvent.for(request, user).emit(self, "User logged in.")