aboutsummaryrefslogtreecommitdiffstats
path: root/src/rlx_log.erl
diff options
context:
space:
mode:
authorJordan Wilberding <[email protected]>2013-09-16 10:30:15 -0700
committerJordan Wilberding <[email protected]>2013-09-16 10:30:15 -0700
commit47d157ee780c9c8fde1fc66ebc769ac7c10f0521 (patch)
tree533ba1b9ee980a664aaad19e3b6c6d15176a4cce /src/rlx_log.erl
parent55f0f5aa4c25d21171113a75f91a37d12a4c78ee (diff)
parent26d1d19cc204d3ba63037b703f1b040a960d9725 (diff)
downloadrelx-47d157ee780c9c8fde1fc66ebc769ac7c10f0521.tar.gz
relx-47d157ee780c9c8fde1fc66ebc769ac7c10f0521.tar.bz2
relx-47d157ee780c9c8fde1fc66ebc769ac7c10f0521.zip
Merge pull request #40 from tsloughter/masterv0.2.00.2.0
Misc fixes, log improvements and README improvements
Diffstat (limited to 'src/rlx_log.erl')
-rw-r--r--src/rlx_log.erl74
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
%%%===================================================================