lib/caddy/logger/buffer.ex

defmodule Caddy.Logger.Buffer do
  use GenServer
  require Logger

  def write(buf) do
    GenServer.cast(__MODULE__, {:write, buf})
  end

  def start_link(_) do
    GenServer.start_link(__MODULE__, "", name: __MODULE__)
  end

  def init(args) do
    Logger.info("Caddy Logger Buffer init")
    {:ok, args}
  end

  def handle_cast({:write, data}, buf) do
    buffer = update_buffer(buf <> data)
    {:noreply, buffer}
  end

  def update_buffer(buffer) do
    case String.split(buffer, "\n") do
      [one] ->
        one

      ["" | rest] ->
        rest |> Enum.join("\n") |> update_buffer()

      [log | rest] ->
        Caddy.Logger.Store.write(log)
        rest |> Enum.join("\n") |> update_buffer()
    end
  end
end