diff options
Diffstat (limited to 'src/rlx_log.erl')
-rw-r--r-- | src/rlx_log.erl | 74 |
1 files changed, 51 insertions, 23 deletions
diff --git a/src/rlx_log.erl b/src/rlx_log.erl index 901ae7c..608c0af 100644 --- a/src/rlx_log.erl +++ b/src/rlx_log.erl @@ -23,6 +23,7 @@ -module(rlx_log). -export([new/1, + new/2, log/4, should/2, debug/2, @@ -35,14 +36,27 @@ atom_log_level/1, format/1]). --export_type([int_log_level/0, +-export_type([t/0, + int_log_level/0, atom_log_level/0, log_level/0, - log_fun/0, - t/0]). + log_fun/0]). -include_lib("relx/include/relx.hrl"). +-define(RED, 31). +-define(GREEN, 32). +-define(YELLOW, 33). +-define(BLUE, 34). +-define(MAGENTA, 35). +-define(CYAN, 36). + +-define(PREFIX, "===> "). + +-record(state_t, {mod=?MODULE :: rlx_log, + log_level=0 :: int_log_level(), + caller=api :: api | command_line}). + %%============================================================================ %% types %%============================================================================ @@ -55,18 +69,23 @@ %% and warn -type atom_log_level() :: error | info | debug. --opaque t() :: {?MODULE, int_log_level()}. - -type log_fun() :: fun(() -> iolist()). +-type color() :: 31..36. + +-opaque t() :: record(state_t). + %%============================================================================ %% API %%============================================================================ %% @doc Create a new 'log level' for the system -spec new(log_level()) -> t(). -new(LogLevel) when LogLevel >= 0, LogLevel =< 2 -> - {?MODULE, LogLevel}; -new(AtomLogLevel) +new(LogLevel) -> + new(LogLevel, api). + +new(LogLevel, Caller) when LogLevel >= 0, LogLevel =< 2 -> + #state_t{mod=?MODULE, log_level=LogLevel, caller=Caller}; +new(AtomLogLevel, Caller) when AtomLogLevel =:= error; AtomLogLevel =:= info; AtomLogLevel =:= debug -> @@ -75,7 +94,7 @@ new(AtomLogLevel) info -> 1; debug -> 2 end, - new(LogLevel). + new(LogLevel, Caller). %% @doc log at the debug level given the current log state with a string or @@ -83,7 +102,7 @@ new(AtomLogLevel) -spec debug(t(), string() | log_fun()) -> ok. debug(LogState, Fun) when erlang:is_function(Fun) -> - log(LogState, ?RLX_DEBUG, Fun); + log(LogState, ?RLX_DEBUG, fun() -> colorize(LogState, ?CYAN, false, Fun()) end); debug(LogState, String) -> debug(LogState, "~s~n", [String]). @@ -91,14 +110,14 @@ debug(LogState, String) -> %% and argements @see io:format/2 -spec debug(t(), string(), [any()]) -> ok. debug(LogState, FormatString, Args) -> - log(LogState, ?RLX_DEBUG, FormatString, Args). + log(LogState, ?RLX_DEBUG, colorize(LogState, ?CYAN, false, FormatString), Args). %% @doc log at the info level given the current log state with a string or %% function that returns a string -spec info(t(), string() | log_fun()) -> ok. info(LogState, Fun) when erlang:is_function(Fun) -> - log(LogState, ?RLX_INFO, Fun); + log(LogState, ?RLX_INFO, fun() -> colorize(LogState, ?GREEN, false, Fun()) end); info(LogState, String) -> info(LogState, "~s~n", [String]). @@ -106,14 +125,14 @@ info(LogState, String) -> %% and argements @see io:format/2 -spec info(t(), string(), [any()]) -> ok. info(LogState, FormatString, Args) -> - log(LogState, ?RLX_INFO, FormatString, Args). + log(LogState, ?RLX_INFO, colorize(LogState, ?GREEN, false, FormatString), Args). %% @doc log at the error level given the current log state with a string or %% format string that returns a function -spec error(t(), string() | log_fun()) -> ok. error(LogState, Fun) when erlang:is_function(Fun) -> - log(LogState, ?RLX_ERROR, Fun); + log(LogState, ?RLX_ERROR, fun() -> colorize(LogState, ?RED, false, Fun()) end); error(LogState, String) -> error(LogState, "~s~n", [String]). @@ -121,21 +140,20 @@ error(LogState, String) -> %% and argements @see io:format/2 -spec error(t(), string(), [any()]) -> ok. error(LogState, FormatString, Args) -> - log(LogState, ?RLX_ERROR, FormatString, Args). + log(LogState, ?RLX_ERROR, colorize(LogState, ?GREEN, false, FormatString), Args). %% @doc Execute the fun passed in if log level is as expected. -spec log(t(), int_log_level(), log_fun()) -> ok. -log({?MODULE, DetailLogLevel}, LogLevel, Fun) +log(#state_t{mod=?MODULE, log_level=DetailLogLevel}, LogLevel, Fun) when DetailLogLevel >= LogLevel -> io:format("~s~n", [Fun()]); log(_, _, _) -> ok. - %% @doc when the module log level is less then or equal to the log level for the %% call then write the log info out. When its not then ignore the call. -spec log(t(), int_log_level(), string(), [any()]) -> ok. -log({?MODULE, DetailLogLevel}, LogLevel, FormatString, Args) +log(#state_t{mod=?MODULE, log_level=DetailLogLevel}, LogLevel, FormatString, Args) when DetailLogLevel >= LogLevel, erlang:is_list(Args) -> io:format(FormatString, Args); @@ -145,7 +163,7 @@ log(_, _, _, _) -> %% @doc return a boolean indicating if the system should log for the specified %% levelg -spec should(t(), int_log_level() | any()) -> boolean(). -should({?MODULE, DetailLogLevel}, LogLevel) +should(#state_t{mod=?MODULE, log_level=DetailLogLevel}, LogLevel) when DetailLogLevel >= LogLevel -> true; should(_, _) -> @@ -153,16 +171,16 @@ should(_, _) -> %% @doc get the current log level as an integer -spec log_level(t()) -> int_log_level(). -log_level({?MODULE, DetailLogLevel}) -> +log_level(#state_t{mod=?MODULE, log_level=DetailLogLevel}) -> DetailLogLevel. %% @doc get the current log level as an atom -spec atom_log_level(t()) -> atom_log_level(). -atom_log_level({?MODULE, ?RLX_ERROR}) -> +atom_log_level(#state_t{mod=?MODULE, log_level=?RLX_ERROR}) -> error; -atom_log_level({?MODULE, ?RLX_INFO}) -> +atom_log_level(#state_t{mod=?MODULE, log_level=?RLX_INFO}) -> info; -atom_log_level({?MODULE, ?RLX_DEBUG}) -> +atom_log_level(#state_t{mod=?MODULE, log_level=?RLX_DEBUG}) -> debug. -spec format(t()) -> iolist(). @@ -172,6 +190,16 @@ format(Log) -> erlang:atom_to_list(atom_log_level(Log)), <<")">>]. +-spec colorize(t(), color(), boolean(), string()) -> string(). +colorize(#state_t{caller=command_line}, Color, false, Msg) when is_integer(Color) -> + colorize_(Color, 0, Msg); +colorize(_LogState, _Color, _Bold, Msg) -> + Msg. + +-spec colorize_(color(), integer(), string()) -> string(). +colorize_(Color, Bold, Msg) when is_integer(Color), is_integer(Bold)-> + lists:flatten(io_lib:format("\033[~B;~Bm~s~s\033[0m", [Bold, Color, ?PREFIX, Msg])). + %%%=================================================================== %%% Test Functions %%%=================================================================== |