Packages
file_only_logger
0.1.33
0.2.70
0.2.69
0.2.65
0.2.64
0.2.63
0.2.62
0.2.61
0.2.60
0.2.59
0.2.58
0.2.57
0.2.56
0.2.55
0.2.54
0.2.53
0.2.52
0.2.51
0.2.50
0.2.49
0.2.48
0.2.47
0.2.45
0.2.44
0.2.43
0.2.42
0.2.41
0.2.40
0.2.39
0.2.38
0.2.37
0.2.36
0.2.35
0.2.34
0.2.33
0.2.31
0.2.30
0.2.29
0.2.28
0.2.27
0.2.26
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.1.58
0.1.57
0.1.55
0.1.54
0.1.53
0.1.52
0.1.51
0.1.50
0.1.49
0.1.47
0.1.46
0.1.45
0.1.44
0.1.43
0.1.42
0.1.41
0.1.40
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
0.1.31
0.1.30
0.1.28
0.1.27
0.1.26
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.0
A simple logger that writes messages to log files only (not to the console).
Current section
Files
Jump to
Current section
Files
lib/file/only/logger.ex
defmodule File.Only.Logger do
@moduledoc """
A simple logger which writes messages to log files only (not to the console).
"""
@fun_limit 66
# Logging levels ordered by importance or severity...
@levels [
:emergency,
:alert,
:critical,
:error,
:warning,
:warn,
:notice,
:info,
:debug
]
@doc """
Either aliases `File.Only.Logger` (this module) and requires the alias or
imports `File.Only.Logger`. In the latter case, you could instead simply
`import File.Only.Logger`.
## Examples
use File.Only.Logger, alias: FileLogger
use File.Only.Logger
import File.Only.Logger
"""
defmacro __using__(options) do
alias = options[:alias]
if alias do
quote do
alias unquote(__MODULE__), as: unquote(alias)
require unquote(alias)
end
else
quote do
import unquote(__MODULE__)
end
end
end
@doc ~S'''
Injects function `info` into the caller's module.
The function will write the `message` returned by the `do_block`
to the configured info log file.
## Examples
use File.Only.Logger
info :game_state, {player, game} do
"""
\nNote that #{player.name}...
• Has joined game #{inspect(game.name)}
• Game state: #{inspect(game.state)}
"""
end
'''
defmacro info(message_id, variables, do_block)
defmacro info(message_id, variables, do: message) do
quote do
def info(unquote(message_id), unquote(variables)) do
File.Only.Logger.Proxy.log(:info, unquote(message))
end
end
end
@doc ~S'''
Injects function `error` into the caller's module.
The function will write the `message` returned by the `do_block`
to the configured error log file.
## Examples
use File.Only.Logger
error :exit, {reason} do
"""
\n'exit' caught...
• Reason: #{inspect(reason)}
"""
end
'''
defmacro error(message_id, variables, do_block)
defmacro error(message_id, variables, do: message) do
quote do
def error(unquote(message_id), unquote(variables)) do
File.Only.Logger.Proxy.log(:error, unquote(message))
end
end
end
for level <- @levels -- [:info, :error] do
defmacro unquote(level)(message_id, variables, do_block)
defmacro unquote(level)(message_id, variables, do: message) do
level = unquote(level)
quote do
def unquote(level)(unquote(message_id), unquote(variables)) do
File.Only.Logger.Proxy.log(unquote(level), unquote(message))
end
end
end
end
@doc ~S'''
Returns string "<module>.<function>/<arity>" e.g. "My.Math.sqrt/1"
for the given [environment](`Macro.Env`). A string longer than `limit`
will be prefixed with "\n\s\s".
## Examples
use File.Only.Logger
error :exit, {reason, env} do
"""
\n'exit' caught...
• Reason: #{inspect(reason)}
• Function: #{fun(env)}
"""
end
'''
defmacro fun(env, limit \\ @fun_limit) do
quote do
File.Only.Logger.Proxy.fun(unquote(env), unquote(limit))
end
end
@doc ~S'''
Returns the application for the current process or module.
Returns `:undefined` if the current process does not belong to any application or the current module is not listed in any application spec.
## Examples
use File.Only.Logger
error :exit, {reason} do
"""
\n'exit' caught...
• Reason: #{inspect(reason)}
• App: #{app()}
"""
end
'''
defmacro app do
quote do
case :application.get_application() do
{:ok, app} -> app
:undefined -> Application.get_application(__MODULE__) || :undefined
end
end
end
@doc ~S'''
Returns the current library name.
## Examples
use File.Only.Logger
error :exit, {reason} do
"""
\n'exit' caught...
• Reason: #{inspect(reason)}
• Library: #{lib()}
"""
end
'''
defmacro lib do
quote do
unquote(Mix.Project.config()[:app])
end
end
@doc ~S'''
Returns the current module name.
## Examples
use File.Only.Logger
error :exit, {reason} do
"""
\n'exit' caught...
• Reason: #{inspect(reason)}
• Module: #{mod()}
"""
end
'''
defmacro mod do
quote do
"#{inspect(__MODULE__)}"
end
end
@doc ~S'''
Returns a heredoc to trace the logged message back to its source using the given [environment](`Macro.Env`).
## Examples
use File.Only.Logger
error :exit, {reason, env} do
"""
\n'exit' caught...
• Reason:
#{inspect(reason)}
#{from(env)}
"""
end
'''
defmacro from(env) do
quote do
"""
• App: #{app()}
• Library: #{lib()}
• Module: #{mod()}
• Function: #{fun(unquote(env))}
"""
|> String.trim_trailing()
end
end
end