diff --git a/src/lager.erl b/src/lager.erl index 705fa23..d6c481c 100644 --- a/src/lager.erl +++ b/src/lager.erl @@ -597,18 +597,32 @@ is_record_known(Record, Module) -> %% @doc Print stacktrace in human readable form pr_stacktrace(Stacktrace) -> + Stacktrace1 = case application:get_env(lager, reverse_pretty_stacktrace, true) of + true -> + lists:reverse(Stacktrace); + _ -> + Stacktrace + end, + pr_stacktrace_(Stacktrace1). + +pr_stacktrace_(Stacktrace) -> Indent = "\n ", lists:foldl( fun(Entry, Acc) -> Acc ++ Indent ++ error_logger_lager_h:format_mfa(Entry) end, [], - lists:reverse(Stacktrace)). + Stacktrace). pr_stacktrace(Stacktrace, {Class, Reason}) -> - lists:flatten( - pr_stacktrace(Stacktrace) ++ "\n" ++ io_lib:format("~s:~p", [Class, Reason])). - + case application:get_env(lager, reverse_pretty_stacktrace, true) of + true -> + lists:flatten( + pr_stacktrace_(lists:reverse(Stacktrace)) ++ "\n" ++ io_lib:format("~s:~p", [Class, Reason])); + _ -> + lists:flatten( + io_lib:format("~s:~p", [Class, Reason]) ++ pr_stacktrace_(Stacktrace)) + end. %% R15 compatibility only filtermap(Fun, List1) -> diff --git a/test/pr_stacktrace_test.erl b/test/pr_stacktrace_test.erl index 6e3d8cc..b68a014 100644 --- a/test/pr_stacktrace_test.erl +++ b/test/pr_stacktrace_test.erl @@ -52,4 +52,18 @@ ExpectedPart = " pr_stacktrace_test:pr_stacktrace_bad_arity_test/0 line 46 lists:concat([], []) error:undef", - ?assertNotEqual(0, string:str(Result, ExpectedPart)). \ No newline at end of file + ?assertNotEqual(0, string:str(Result, ExpectedPart)). + +pr_stacktrace_no_reverse_test() -> + application:set_env(lager, reverse_pretty_stacktrace, false), + Result = try + bad_arity() + catch + Class:Reason -> + lager:pr_stacktrace(erlang:get_stacktrace(), {Class, Reason}) + end, +ExpectedPart = "error:undef + lists:concat([], []) + pr_stacktrace_test:pr_stacktrace_bad_arity_test/0 line 60", + + ?assertEqual(0, string:str(Result, ExpectedPart)).