diff --git a/THANKS b/THANKS index b5d19be..79885c7 100644 --- a/THANKS +++ b/THANKS @@ -129,3 +129,4 @@ Andras Horvath Drew Varner Roberto Aloi Luis Rascao +Andrey Teplyashin diff --git a/ebin/rebar.app b/ebin/rebar.app index 6e3609b..13e6a74 100644 --- a/ebin/rebar.app +++ b/ebin/rebar.app @@ -56,6 +56,9 @@ %% Default log level {log_level, warn}, + %% Log colored + {log_colored, true}, + %% any_dir processing modules {any_dir_modules, [ rebar_require_vsn, diff --git a/inttest/logging/logging_rt.erl b/inttest/logging/logging_rt.erl index d3e1c0f..cf9815b 100644 --- a/inttest/logging/logging_rt.erl +++ b/inttest/logging/logging_rt.erl @@ -40,23 +40,40 @@ run(_Dir) -> SharedExpected = "==> logging_rt \\(compile\\)", %% provoke ERROR due to an invalid app file retest:log(info, "Check 'compile' failure output~n"), + {Error, Warn, Info, Debug} = + case application:get_env(rebar, log_colored) of + {ok, true} -> + { + "\\e\\[1m\\e\\[31mERROR: \\e\\[0m", + "\\e\\[33mWARN: \\e\\[0m", + "\\e\\[32mINFO: \\e\\[0m", + "\\e\\[34mDEBUG: \\e\\[0m" + }; + _ -> + { + "ERROR: ", + "WARN: ", + "INFO: ", + "DEBUG: " + } + end, ok = check_output("./rebar compile -q", should_fail, - [SharedExpected, "ERROR: "], - ["WARN: ", "INFO: ", "DEBUG: "]), + [SharedExpected, Error], + [Warn, Info, Debug]), %% fix bad app file ok = file:write_file(?APP_FILE, app(logging, [])), retest:log(info, "Check 'compile' success output~n"), ok = check_output("./rebar compile", should_succeed, [SharedExpected], - ["ERROR: ", "WARN: ", "INFO: ", "DEBUG: "]), + [Error, Warn, Info, Debug]), retest:log(info, "Check 'compile -v' success output~n"), ok = check_output("./rebar compile -v", should_succeed, [SharedExpected], - ["ERROR: ", "INFO: ", "DEBUG: "]), + [Error, Info, Debug]), retest:log(info, "Check 'compile -vv' success output~n"), ok = check_output("./rebar compile -vv", should_succeed, - [SharedExpected, "DEBUG: "], - ["ERROR: ", "INFO: "]), + [SharedExpected, Debug], + [Error, Info]), ok. check_output(Cmd, FailureMode, Expected, Unexpected) -> @@ -73,7 +90,7 @@ check_output(Cmd, FailureMode, Expected, Unexpected) -> end. check_output1(Cmd, Captured, Expected, Unexpected) -> - ReOpts = [{capture, all, list}], + ReOpts = [{capture, all, list}, unicode], ExMatches = lists:zf( fun(Pattern) -> diff --git a/src/rebar_log.erl b/src/rebar_log.erl index ba25332..3fdaaea 100644 --- a/src/rebar_log.erl +++ b/src/rebar_log.erl @@ -50,19 +50,28 @@ init(Config) -> ?WARN_LEVEL -> set_level(warn); ?INFO_LEVEL -> set_level(info); ?DEBUG_LEVEL -> set_level(debug) - end. + end, + LogColored = rebar_config:get_global(Config, log_colored, true), + set_log_colored(LogColored). + set_level(Level) -> - ok = application:set_env(rebar, log_level, Level). + erlang:put(rebar_log_level, Level). + +set_log_colored(true) -> + erlang:put(rebar_log_colored, true); +set_log_colored(_LogColored) -> + erlang:put(rebar_log_colored, false). log(Level, Str, Args) -> log(standard_io, Level, Str, Args). log(Device, Level, Str, Args) -> - {ok, LogLevel} = application:get_env(rebar, log_level), + LogLevel = erlang:get(rebar_log_level), + LogColored = erlang:get(rebar_log_colored), case should_log(LogLevel, Level) of true -> - io:format(Device, log_prefix(Level) ++ Str, Args); + io:format(Device, log_prefix(Level, LogColored) ++ Str, Args); false -> ok end. @@ -90,7 +99,33 @@ should_log(error, error) -> true; should_log(error, _) -> false; should_log(_, _) -> false. +log_prefix(Level, _Colored = false) -> + log_prefix(Level); +log_prefix(Level, _Colored = true) -> + color_from_level(Level) ++ log_prefix(Level) ++ reset_color(). + log_prefix(debug) -> "DEBUG: "; log_prefix(info) -> "INFO: "; log_prefix(warn) -> "WARN: "; log_prefix(error) -> "ERROR: ". + +color_from_level(debug) -> + color_foreground(blue); +color_from_level(info) -> + color_foreground(green); +color_from_level(warn) -> + color_foreground(yellow); +color_from_level(error) -> + color_bold() ++ color_foreground(red). + +color_foreground(black) -> "\e[30m"; +color_foreground(red) -> "\e[31m"; +color_foreground(green) -> "\e[32m"; +color_foreground(yellow) -> "\e[33m"; +color_foreground(blue) -> "\e[34m"; +color_foreground(magenta) -> "\e[35m"; +color_foreground(cyan) -> "\e[36m"; +color_foreground(white) -> "\e[37m". + +color_bold() -> "\e[1m". +reset_color() -> "\e[0m".