Current section
Files
Jump to
Current section
Files
lib/log_vol.ex
defmodule LogVol do
@moduledoc """
Documentation for `LogVol`, a wrapper around Elixir's
native `Logger` with volume controls.
"""
@app :log_vol
@supported_volumes [
:very_verbose,
:verbose,
:normal,
:quiet,
:silent
]
require Logger
@doc """
Sets the logging volume for the application. There are
5 supported log volumes:
:very_verbose
:verbose
:normal
:quiet
:silent
Returns `:ok` if successful, else `{:error, reason}`.
"""
def set(volume) do
unless Enum.member?(@supported_volumes, volume) do
{:error, "Unsupported volume. Try iex> h LogVol.set"}
else
Application.put_env(@app, :volume, volume)
end
end
@doc """
Returns the currently set logging volume for the application.
## Examples
iex> LogVol.volume
:normal
"""
def volume do
Application.fetch_env!(@app, :volume)
end
@doc """
Logs the debug message at the currently set volume.
If a message is not specified at a volume, nothing
will be displayed if `debug` is called at that volume.
## Usage
For convenience, `debug/1` can be given a string to log at
`:normal` volume or a keyword list of strings to log at
any volume. `debug/2` takes a string to log at `:normal` volume
and a keyword list of strings to log at other volumes.
## Examples
iex> LogVol.volume
:normal
iex> LogVol.debug("normal msg")
timestamp [debug] normal msg
:ok
iex> LogVol.set :verbose
:ok
iex> LogVol.debug("normal msg", verbose: "verbose msg")
:noop
iex> LogVol.debug(verbose: "verbose msg")
timestamp [debug] verbose msg
:ok
iex> LogVol.debug(very_verbose: "very verbose msg")
:noop
iex> LogVol.debug("normal msg")
:noop
"""
def debug(string_or_keyword)
def debug(string) when is_binary(string) do
string |> debug([])
end
def debug(options) when is_list(options) do
Keyword.get(options, :normal) |> debug(options)
end
@doc """
See docs for `debug/1.`
"""
def debug(string, options) do
handle_log(:debug, string, options)
end
@doc """
Logs the info message at the currently set volume.
If a message is not specified at a volume, nothing
will be displayed if `info` is called at that volume.
## Usage
For convenience, `info/1` can be given a string to log at
`:normal` volume or a keyword list of strings to log at
any volume. `info/2` takes a string to log at `:normal` volume
and a keyword list of strings to log at other volumes.
## Examples
iex> LogVol.volume
:normal
iex> LogVol.info("normal msg")
timestamp [info] normal msg
:ok
iex> LogVol.set :verbose
:ok
iex> LogVol.info("normal msg", verbose: "verbose msg")
:noop
iex> LogVol.info(verbose: "verbose msg")
timestamp [info] verbose msg
:ok
iex> LogVol.info(very_verbose: "very verbose msg")
:noop
iex> LogVol.info("normal msg")
:noop
"""
def info(string_or_keyword)
def info(string) when is_binary(string) do
string |> info([])
end
def info(options) when is_list(options) do
Keyword.get(options, :normal) |> info(options)
end
@doc """
See docs for `info/1.`
"""
def info(string, options) do
handle_log(:info, string, options)
end
@doc """
Logs the warn message at the currently set volume.
If a message is not specified at a volume, nothing
will be displayed if `warn` is called at that volume.
## Usage
For convenience, `warn/1` can be given a string to log at
`:normal` volume or a keyword list of strings to log at
any volume. `warn/2` takes a string to log at `:normal` volume
and a keyword list of strings to log at other volumes.
## Examples
iex> LogVol.volume
:normal
iex> LogVol.warn("normal msg")
timestamp [warn] normal msg
:ok
iex> LogVol.set :verbose
:ok
iex> LogVol.warn("normal msg", verbose: "verbose msg")
:noop
iex> LogVol.warn(verbose: "verbose msg")
timestamp [warn] verbose msg
:ok
iex> LogVol.warn(very_verbose: "very verbose msg")
:noop
iex> LogVol.warn("normal msg")
:noop
"""
def warn(string_or_keyword)
def warn(string) when is_binary(string) do
string |> warn([])
end
def warn(options) when is_list(options) do
Keyword.get(options, :normal) |> warn(options)
end
@doc """
See docs for `warn/1.`
"""
def warn(string, options) do
handle_log(:warn, string, options)
end
@doc """
Logs the error message at the currently set volume.
If a message is not specified at a volume, nothing
will be displayed if `error` is called at that volume.
## Usage
For convenience, `error/1` can be given a string to log at
`:normal` volume or a keyword list of strings to log at
any volume. `error/2` takes a string to log at `:normal` volume
and a keyword list of strings to log at other volumes.
## Examples
iex> LogVol.volume
:normal
iex> LogVol.error("normal msg")
timestamp [error] normal msg
:ok
iex> LogVol.set :verbose
:ok
iex> LogVol.error("normal msg", verbose: "verbose msg")
:noop
iex> LogVol.error(verbose: "verbose msg")
timestamp [error] verbose msg
:ok
iex> LogVol.error(very_verbose: "very verbose msg")
:noop
iex> LogVol.error("normal msg")
:noop
"""
def error(string_or_keyword)
def error(string) when is_binary(string) do
string |> error([])
end
def error(options) when is_list(options) do
Keyword.get(options, :normal) |> error(options)
end
@doc """
See docs for `error/1.`
"""
def error(string, options) do
handle_log(:error, string, options)
end
defp log_or_ignore(nil, _level) do
:noop
end
defp log_or_ignore(string, level) do
case level do
:debug -> Logger.debug(string)
:info -> Logger.info(string)
:warn -> Logger.warn(string)
:error -> Logger.error(string)
_ -> raise "Log level #{level} isn't supported"
end
end
defp handle_log(level, string, options) do
case Application.fetch_env!(@app, :volume) do
:very_verbose ->
Keyword.get(options, :very_verbose) |> log_or_ignore(level)
:verbose ->
Keyword.get(options, :verbose) |> log_or_ignore(level)
:normal -> string |> log_or_ignore(level)
:quiet ->
Keyword.get(options, :quiet) |> log_or_ignore(level)
_ -> :noop
end
end
end