Packages

Slogger is a simple logger that allows flexible, and easily customizable, module-level control of logging.

Current section

Files

Jump to
slogger lib slogger.ex
Raw

lib/slogger.ex

defmodule Slogger do
@moduledoc """
The unquoted expression in the __using__/1 macro `unquote((["Slogger", "Loggers"] ++ Module.split(__CALLER__.module)) |> Module.concat)`
puts the generated logging module in question into a namespace under `Slogger.Loggers`.
For example if `MyModule` has `use Slogger` then the module `Slogger.Loggers.MyModule` is
generated and is the module that has the `alias` of Slogger in the `MyModule` namespace.
"""
alias Slogger.Table
@levels [:debug, :info, :warn, :error]
@type log_level :: :debug | :info | :warn | :error
defguard is_level(item) when item in @levels
def levels() do
@levels
end
@spec default_level() :: log_level()
def default_level() do
Application.get_env(:slogger, :default_level) || :info
end
@spec should_log?(module(), log_level()) :: boolean()
def should_log?(module, level) do
ordinal(module.get_level()) <= ordinal(level)
end
@spec ordinal(:debug | :error | :info | :warn) :: 0 | 1 | 2 | 3
defp ordinal(:debug), do: 0
defp ordinal(:info), do: 1
defp ordinal(:warn), do: 2
defp ordinal(:error), do: 3
def set_level(module, level) when is_level(level) do
Table.start()
Table.set_level(module, level)
end
def get_level(module) do
module.get_level()
end
defmacro __using__(opts) do
quote do
@log_level Keyword.get(unquote(opts), :level, Slogger.default_level())
if @log_level not in Slogger.levels() do
raise CompileError, message: "Slogger :lavel can only be one of #{inspect(Slogger.levels)}. Got #{inspect(@log_level)}"
end
def set_level(level) do
Slogger.set_level(__MODULE__, level)
end
def get_level() do
Table.get_level(__MODULE__) || @log_level
end
def log(level, entry, opts \\ []) do
if Slogger.should_log?(__MODULE__, level) do
bare_log(level, entry, opts)
end
:ok
end
def bare_log(level, entry, opts \\ []) do
Logger.bare_log(level, entry, opts)
end
def debug(entry, opts \\ []), do: log(:debug, entry, opts)
def info(entry, opts \\ []), do: log(:info, entry, opts)
def warn(entry, opts \\ []), do: log(:warn, entry, opts)
def error(entry, opts \\ []), do: log(:error, entry, opts)
end
end
end