Packages

Database backed server log viewer for Phoenix LiveDashboard

Current section

Files

Jump to
server_logger lib server_logger migration.ex
Raw

lib/server_logger/migration.ex

defmodule ServerLogger.Migration do
@moduledoc """
Provides migration functions for setting up the ServerLogger database tables.
Used by the generated migration file from `mix server_logger.gen.migration`.
## Usage
After running `mix server_logger.gen.migration`, the generated file will contain:
defmodule MyApp.Repo.Migrations.CreateServerLogs do
use Ecto.Migration
def up, do: ServerLogger.Migration.up()
def down, do: ServerLogger.Migration.down()
end
"""
use Ecto.Migration
def up do
# Parent partitioned table — raw SQL required for PARTITION BY
execute("""
CREATE TABLE server_logs (
id bigserial NOT NULL,
level varchar NOT NULL,
message text NOT NULL,
module varchar,
function varchar,
request_id varchar,
pid varchar,
metadata jsonb DEFAULT '{}',
logged_at timestamptz NOT NULL,
inserted_at timestamptz NOT NULL DEFAULT now(),
PRIMARY KEY (id, logged_at)
) PARTITION BY RANGE (logged_at)
""")
# Indexes on parent (inherited by all partitions)
execute("CREATE INDEX server_logs_logged_at_idx ON server_logs (logged_at)")
execute("CREATE INDEX server_logs_level_idx ON server_logs (level)")
execute("CREATE INDEX server_logs_module_idx ON server_logs (module)")
execute("CREATE INDEX server_logs_request_id_idx ON server_logs (request_id)")
# Create current month + next month partitions dynamically
today = Date.utc_today()
create_partition(today.year, today.month)
next = Date.utc_today() |> Date.end_of_month() |> Date.add(1)
create_partition(next.year, next.month)
end
def down do
execute("DROP TABLE IF EXISTS server_logs CASCADE")
end
defp create_partition(year, month) do
name = partition_name(year, month)
from_date = Date.new!(year, month, 1)
to_date = from_date |> Date.end_of_month() |> Date.add(1)
execute("""
CREATE TABLE IF NOT EXISTS #{name} PARTITION OF server_logs
FOR VALUES FROM ('#{from_date}') TO ('#{to_date}')
""")
end
defp partition_name(year, month) do
"server_logs_#{year}#{String.pad_leading(Integer.to_string(month), 2, "0")}"
end
end