From 12fa1977bbcc02184b6b45b77d4d52faf0a006d0 Mon Sep 17 00:00:00 2001 From: Mark Allen Date: Fri, 25 Mar 2016 16:42:16 -0500 Subject: [PATCH 1/6] Ensure traces pointed to files work in config file --- src/lager_app.erl | 10 ++++--- src/lager_file_backend.erl | 55 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/lager_app.erl b/src/lager_app.erl index ebbf330..15efd3f 100644 --- a/src/lager_app.erl +++ b/src/lager_app.erl @@ -256,12 +256,14 @@ add_configured_traces() -> TraceVal end, - lists:foreach(fun({Handler, Filter, Level}) -> - {ok, _} = lager:trace(Handler, Filter, Level) - end, - Traces), + lists:foreach(fun start_configured_trace/1, Traces), ok. +start_configured_trace({Handler, Filter}) -> + {ok, _} = lager:trace(Handler, Filter); +start_configured_trace({Handler, Filter, Level}) when is_atom(Level) -> + {ok, _} = lager:trace(Handler, Filter, Level). + maybe_make_handler_id(Mod, Config) -> %% Allow the backend to generate a gen_event handler id, if it wants to. %% We don't use erlang:function_exported here because that requires the module diff --git a/src/lager_file_backend.erl b/src/lager_file_backend.erl index a0fd225..10ce9c7 100644 --- a/src/lager_file_backend.erl +++ b/src/lager_file_backend.erl @@ -799,6 +799,61 @@ filesystem_test_() -> ] }. +trace_files_test_() -> + {foreach, + fun() -> + file:delete("events.log"), + file:delete("test.log"), + file:delete("debug.log"), + error_logger:tty(false), + application:load(lager), + application:set_env(lager, handlers, [{lager_file_backend, [{file, "test.log"}, + {level, error}, + {formatter, lager_default_formatter}, + {formatter_config, [message, "\n"]}]}]), + application:set_env(lager, traces, [ + { % get default level of debug + {lager_file_backend, "debug.log"}, [{module, ?MODULE}] + }, + { % Handler Filters Level + {lager_file_backend, "events.log"}, [{module, ?MODULE}], notice + } + ] + ), + application:set_env(lager, async_threshold, undefined), + lager:start() + end, + fun(_) -> + application:stop(lager), + file:delete("events.log"), + file:delete("test.log"), + file:delete("debug.log"), + error_logger:tty(true) + end, + [ + {"a trace using file backend set up in configuration should work", + fun() -> + lager:error("trace test error message"), + lager:info("info message"), + %% not eligible for trace + lager:log(error, self(), "Not trace test message"), + {ok, BinInfo} = file:read_file("events.log"), + ?assertMatch([_, _, "[error]", _, "trace test error message\n"], + re:split(BinInfo, " ", [{return, list}, {parts, 5}])), + ?assert(filelib:is_regular("test.log")), + {ok, BinInfo2} = file:read_file("test.log"), + ?assertMatch(["trace test error message", "Not trace test message\n"], + re:split(BinInfo2, "\n", [{return, list}, {parts, 2}])), + ?assert(filelib:is_regular("debug.log")), + %% XXX Aughhhh, wish I could force this to flush somehow... + timer:sleep(1000), + {ok, BinInfo3} = file:read_file("debug.log"), + ?assertEqual(2, length(re:split(BinInfo3, "\n", [{return, list}, trim]))) + end + } + ] + }. + formatting_test_() -> {foreach, fun() -> From 099a35765ce936913db57f937e3488d1ec959039 Mon Sep 17 00:00:00 2001 From: Mark Allen Date: Wed, 30 Mar 2016 12:05:55 -0500 Subject: [PATCH 2/6] Update README about traces from configuration --- README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/README.md b/README.md index b8c3ff7..32bb6c1 100644 --- a/README.md +++ b/README.md @@ -568,6 +568,35 @@ The former can be ameliorated by opening multiple traces; the latter can be fixed by rearchitecting lager's file backend, but this has not been tackled. +### Traces from configuration + +Lager supports starting traces from its configuration file. The keyword +to define them is `traces`, followed by a proplist of tuples that define +a backend handler and zero or more filters in a required list, +followed by an optional message severity level. + +An example looks like this: + +```erlang +{lager, [ + {handlers, [...]}, + {traces, [ + %% handler, filter, message level (defaults to debug if not given) + {lager_console_backend, [{module, foo}], info }, + {{lager_file_backend, "trace.log"}, [{request, '>', 120}], error}, + {{lager_file_backend, "event.log"}, [{module, bar}] } %% implied debug level here + ]} +]}. +``` + +In this example, we have three traces. One using the console backend, and two +using the file backend. If the message severity level is left out, it defaults +to `debug` as in the last file backend example. + +The `traces` keyword works on alternative sinks too but the same limitations +and caveats noted above apply. + + Setting the truncation limit at compile-time -------------------------------------------- Lager defaults to truncating messages at 4096 bytes, you can alter this by From 8f351602ef634b5034207c1b064e37db5df943dd Mon Sep 17 00:00:00 2001 From: Mark Allen Date: Wed, 30 Mar 2016 14:14:23 -0500 Subject: [PATCH 3/6] Clarify that 2-tuple not support in prior releases --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 32bb6c1..7267e6b 100644 --- a/README.md +++ b/README.md @@ -596,6 +596,9 @@ to `debug` as in the last file backend example. The `traces` keyword works on alternative sinks too but the same limitations and caveats noted above apply. +**IMPORTANT**: You **must** define a severity level in all lager releases +up to and including 3.1.0 or previous. The 2-tuple form wasn't added until +3.2.0. Setting the truncation limit at compile-time -------------------------------------------- From 991383d24ba540c66a538e609ffb0318c440eb76 Mon Sep 17 00:00:00 2001 From: Mark Allen Date: Wed, 30 Mar 2016 15:55:12 -0500 Subject: [PATCH 4/6] Make sure the ETS config table is really dead --- test/lager_test_backend.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/lager_test_backend.erl b/test/lager_test_backend.erl index dd4950c..f39e68d 100644 --- a/test/lager_test_backend.erl +++ b/test/lager_test_backend.erl @@ -798,6 +798,7 @@ setup() -> gen_event:call(lager_event, ?MODULE, flush). cleanup(_) -> + catch ets:delete(lager_config), %% kill the ets config table with fire application:stop(lager), application:stop(goldrush), error_logger:tty(true). From 1568cfcd9cb59966d66780f4c1c80f8270eadb18 Mon Sep 17 00:00:00 2001 From: Mark Allen Date: Thu, 31 Mar 2016 17:30:23 +0000 Subject: [PATCH 5/6] Completely remove lager_config table --- src/lager_file_backend.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lager_file_backend.erl b/src/lager_file_backend.erl index 10ce9c7..cdc9390 100644 --- a/src/lager_file_backend.erl +++ b/src/lager_file_backend.erl @@ -824,6 +824,7 @@ trace_files_test_() -> lager:start() end, fun(_) -> + catch ets:delete(lager_config), application:stop(lager), file:delete("events.log"), file:delete("test.log"), From 7aaa6add0810889659cbecd569cf17d8b7dda9fb Mon Sep 17 00:00:00 2001 From: Mark Allen Date: Thu, 31 Mar 2016 17:38:49 +0000 Subject: [PATCH 6/6] Remove any lingering traces config --- src/lager_file_backend.erl | 2 ++ test/lager_test_backend.erl | 1 + 2 files changed, 3 insertions(+) diff --git a/src/lager_file_backend.erl b/src/lager_file_backend.erl index cdc9390..2d50165 100644 --- a/src/lager_file_backend.erl +++ b/src/lager_file_backend.erl @@ -825,7 +825,9 @@ trace_files_test_() -> end, fun(_) -> catch ets:delete(lager_config), + application:unset_env(lager, traces), application:stop(lager), + file:delete("events.log"), file:delete("test.log"), file:delete("debug.log"), diff --git a/test/lager_test_backend.erl b/test/lager_test_backend.erl index f39e68d..cc22d6e 100644 --- a/test/lager_test_backend.erl +++ b/test/lager_test_backend.erl @@ -794,6 +794,7 @@ setup() -> application:load(lager), application:set_env(lager, handlers, [{?MODULE, info}]), application:set_env(lager, error_logger_redirect, false), + application:unset_env(lager, traces), lager:start(), gen_event:call(lager_event, ?MODULE, flush).