From c992bf9ba6e5875bc1cd874056d8613912537e56 Mon Sep 17 00:00:00 2001 From: Eric Oestrich Date: Mon, 2 Oct 2023 13:20:38 -0400 Subject: [PATCH] Reset indexes when persisted logs are inserted These logs likely have a much higher index in the metadata and any new logs will show up "before" these logs even though new logs are newer. Also reset the default buffer anytime the configuration changes, so we don't have duplicate logs when we reinsert the existing logs. --- lib/ring_logger/server.ex | 14 ++++++------- test/ring_logger_test.exs | 44 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/lib/ring_logger/server.ex b/lib/ring_logger/server.ex index d6399c6..472244e 100644 --- a/lib/ring_logger/server.ex +++ b/lib/ring_logger/server.ex @@ -139,14 +139,9 @@ defmodule RingLogger.Server do def handle_call({:configure, opts}, _from, state) do logs = merge_buffers(state) - state = - case Keyword.get(opts, :max_size) do - nil -> - state + max_size = Keyword.get(opts, :max_size, @default_max_size) - max_size -> - %__MODULE__{state | default_buffer: CircularBuffer.new(max_size)} - end + state = %__MODULE__{state | default_buffer: CircularBuffer.new(max_size)} state = case Keyword.get(opts, :buffers) do @@ -330,7 +325,10 @@ defmodule RingLogger.Server do case Persistence.load(state.persist_path) do logs when is_list(logs) -> state = - Enum.reduce(logs, state, fn log_entry, state -> + logs + |> Enum.with_index() + |> Enum.reduce(state, fn {log_entry, index}, state -> + log_entry = %{log_entry | metadata: Keyword.put(log_entry.metadata, :index, index)} insert_log(state, log_entry) end) diff --git a/test/ring_logger_test.exs b/test/ring_logger_test.exs index 720215e..891521f 100644 --- a/test/ring_logger_test.exs +++ b/test/ring_logger_test.exs @@ -833,6 +833,50 @@ defmodule RingLoggerTest do File.rm!("test/persistence.log") end + + test "loading the log resets indexes", %{io: io} do + Logger.remove_backend(RingLogger) + + logs = [ + %{ + level: :debug, + module: Logger, + message: "Foo", + timestamp: {{2023, 2, 8}, {13, 58, 31, 343}}, + metadata: [index: 5000] + }, + %{ + level: :debug, + module: Logger, + message: "Bar", + timestamp: {{2023, 2, 8}, {13, 58, 31, 343}}, + metadata: [index: 6000] + } + ] + + :ok = Persistence.save("test/persistence.log", logs) + + # Start the backend with _just_ the persist_path and restore old + # config to allow other tests to run without loading a log file + old_env = Application.get_env(:logger, RingLogger) + Application.put_env(:logger, RingLogger, persist_path: "test/persistence.log") + Logger.add_backend(RingLogger) + Application.put_env(:logger, RingLogger, old_env) + + Logger.add_backend(RingLogger) + + :ok = RingLogger.attach(io: io) + + [foo, bar] = RingLogger.get(0, 0) + + assert foo.message == "Foo" + assert foo.metadata[:index] == 0 + + assert bar.message == "Bar" + assert bar.metadata[:index] == 1 + + File.rm!("test/persistence.log") + end end defp capture_log(fun) do