diff --git a/src/lager.erl b/src/lager.erl index 3df78ee..ebbc10e 100644 --- a/src/lager.erl +++ b/src/lager.erl @@ -189,21 +189,22 @@ trace_file(File, Filter, Options) when is_list(Options) -> trace_file(File, Filter, debug, Options). trace_file(File, Filter, Level, Options) -> - case validate_trace_filters(Filter, Level, {lager_file_backend, File}) of + FileName = lager_util:expand_path(File), + case validate_trace_filters(Filter, Level, {lager_file_backend, FileName}) of {Sink, {ok, Trace}} -> Handlers = lager_config:global_get(handlers, []), %% check if this file backend is already installed - Res = case lists:keyfind({lager_file_backend, File}, 1, Handlers) of + Res = case lists:keyfind({lager_file_backend, FileName}, 1, Handlers) of false -> %% install the handler LogFileConfig = lists:keystore(level, 1, lists:keystore(file, 1, Options, - {file, File}), + {file, FileName}), {level, none}), HandlerInfo = - lager_app:start_handler(Sink, {lager_file_backend, File}, + lager_app:start_handler(Sink, {lager_file_backend, FileName}, LogFileConfig), lager_config:global_set(handlers, [HandlerInfo|Handlers]), {ok, installed}; @@ -216,7 +217,7 @@ trace_file(File, Filter, Level, Options) -> {ok, _} -> %% XXX Double-check this logic for {ok, exists} add_trace_to_loglevel_config(Trace, Sink), - {ok, {{lager_file_backend, File}, Filter, Level}}; + {ok, {{lager_file_backend, FileName}, Filter, Level}}; {error, _} = E -> E end; diff --git a/src/lager_file_backend.erl b/src/lager_file_backend.erl index 15292d6..9e6affa 100644 --- a/src/lager_file_backend.erl +++ b/src/lager_file_backend.erl @@ -708,6 +708,20 @@ filesystem_test_() -> ?assertMatch([_, _, "[error]", _, "Test message\n"], re:split(Bin3, " ", [{return, list}, {parts, 5}])) end }, + {"tracing to a dedicated file should work even if root_log is set", + fun() -> + {ok, P} = file:get_cwd(), + file:delete(P ++ "/test_root_log/foo.log"), + application:set_env(lager, log_root, P++"/test_root_log"), + {ok, _} = lager:trace_file("foo.log", [{module, ?MODULE}]), + lager:error("Test message"), + %% not elegible for trace + lager:log(error, self(), "Test message"), + {ok, Bin3} = file:read_file(P++"/test_root_log/foo.log"), + application:unset_env(lager, log_root), + ?assertMatch([_, _, "[error]", _, "Test message\n"], re:split(Bin3, " ", [{return, list}, {parts, 5}])) + end + }, {"tracing with options should work", fun() -> file:delete("foo.log"),