|
@ -34,9 +34,8 @@ |
|
|
|
|
|
|
|
|
-ifdef(TEST). |
|
|
-ifdef(TEST). |
|
|
-include_lib("eunit/include/eunit.hrl"). |
|
|
-include_lib("eunit/include/eunit.hrl"). |
|
|
-endif. |
|
|
|
|
|
|
|
|
|
|
|
-include_lib("kernel/include/file.hrl"). |
|
|
-include_lib("kernel/include/file.hrl"). |
|
|
|
|
|
-endif. |
|
|
|
|
|
|
|
|
-export([init/1, handle_call/2, handle_event/2, handle_info/2, terminate/2, |
|
|
-export([init/1, handle_call/2, handle_event/2, handle_info/2, terminate/2, |
|
|
code_change/3]). |
|
|
code_change/3]). |
|
@ -168,7 +167,7 @@ write(#file{name=Name, fd=FD, inode=Inode, flap=Flap, size=RotSize, |
|
|
true -> |
|
|
true -> |
|
|
File; |
|
|
File; |
|
|
_ -> |
|
|
_ -> |
|
|
?INT_LOG(error, "Failed to reopen logfile ~s with error ~s", |
|
|
|
|
|
|
|
|
?INT_LOG(error, "Failed to reopen log file ~s with error ~s", |
|
|
[Name, file:format_error(Reason)]), |
|
|
[Name, file:format_error(Reason)]), |
|
|
File#file{flap=true} |
|
|
File#file{flap=true} |
|
|
end |
|
|
end |
|
@ -176,6 +175,15 @@ write(#file{name=Name, fd=FD, inode=Inode, flap=Flap, size=RotSize, |
|
|
|
|
|
|
|
|
validate_logfiles([]) -> |
|
|
validate_logfiles([]) -> |
|
|
[]; |
|
|
[]; |
|
|
|
|
|
validate_logfiles([{Name, Level}|T]) -> |
|
|
|
|
|
case lists:member(Level, ?LEVELS) of |
|
|
|
|
|
true -> |
|
|
|
|
|
[{Name, Level, 0, undefined, 0}|validate_logfiles(T)]; |
|
|
|
|
|
_ -> |
|
|
|
|
|
?INT_LOG(error, "Invalid log level of ~p for ~s.", |
|
|
|
|
|
[Level, Name]), |
|
|
|
|
|
validate_logfiles(T) |
|
|
|
|
|
end; |
|
|
validate_logfiles([{Name, Level, Size, Date, Count}|T]) -> |
|
|
validate_logfiles([{Name, Level, Size, Date, Count}|T]) -> |
|
|
ValidLevel = (lists:member(Level, ?LEVELS)), |
|
|
ValidLevel = (lists:member(Level, ?LEVELS)), |
|
|
ValidSize = (is_integer(Size) andalso Size >= 0), |
|
|
ValidSize = (is_integer(Size) andalso Size >= 0), |
|
@ -209,7 +217,7 @@ validate_logfiles([{Name, Level, Size, Date, Count}|T]) -> |
|
|
end |
|
|
end |
|
|
end; |
|
|
end; |
|
|
validate_logfiles([H|T]) -> |
|
|
validate_logfiles([H|T]) -> |
|
|
?INT_LOG(error, "Invalid logfile config ~p.", [H]), |
|
|
|
|
|
|
|
|
?INT_LOG(error, "Invalid log file config ~p.", [H]), |
|
|
validate_logfiles(T). |
|
|
validate_logfiles(T). |
|
|
|
|
|
|
|
|
schedule_rotation(_, undefined) -> |
|
|
schedule_rotation(_, undefined) -> |
|
@ -248,5 +256,123 @@ rotation_test() -> |
|
|
?assertMatch(#file{name="test.log", level=?DEBUG}, Result2), |
|
|
?assertMatch(#file{name="test.log", level=?DEBUG}, Result2), |
|
|
ok. |
|
|
ok. |
|
|
|
|
|
|
|
|
|
|
|
filesystem_test_() -> |
|
|
|
|
|
{foreach, |
|
|
|
|
|
fun() -> |
|
|
|
|
|
file:write_file("test.log", ""), |
|
|
|
|
|
error_logger:tty(false), |
|
|
|
|
|
application:load(lager), |
|
|
|
|
|
application:set_env(lager, handlers, [{lager_test_backend, info}]), |
|
|
|
|
|
application:set_env(lager, error_logger_redirect, false), |
|
|
|
|
|
application:start(lager) |
|
|
|
|
|
end, |
|
|
|
|
|
fun(_) -> |
|
|
|
|
|
file:delete("test.log"), |
|
|
|
|
|
application:stop(lager), |
|
|
|
|
|
application:unload(lager), |
|
|
|
|
|
error_logger:tty(true) |
|
|
|
|
|
end, |
|
|
|
|
|
[ |
|
|
|
|
|
{"under normal circumstances, file should be opened", |
|
|
|
|
|
fun() -> |
|
|
|
|
|
gen_event:add_handler(lager_event, lager_file_backend, [{"test.log", info}]), |
|
|
|
|
|
lager:log(error, self(), "Test message"), |
|
|
|
|
|
{ok, Bin} = file:read_file("test.log"), |
|
|
|
|
|
Pid = pid_to_list(self()), |
|
|
|
|
|
?assertMatch([_, _, "[error]", Pid, "Test message\n"], re:split(Bin, " ", [{return, list}, {parts, 5}])) |
|
|
|
|
|
end |
|
|
|
|
|
}, |
|
|
|
|
|
{"file can't be opened on startup triggers an error message", |
|
|
|
|
|
fun() -> |
|
|
|
|
|
{ok, FInfo} = file:read_file_info("test.log"), |
|
|
|
|
|
file:write_file_info("test.log", FInfo#file_info{mode = 0}), |
|
|
|
|
|
gen_event:add_handler(lager_event, lager_file_backend, [{"test.log", info}]), |
|
|
|
|
|
?assertEqual(1, lager_test_backend:count()), |
|
|
|
|
|
{_Level, _Time, [_, _, Message]} = lager_test_backend:pop(), |
|
|
|
|
|
?assertEqual("Failed to open log file test.log with error permission denied", lists:flatten(Message)) |
|
|
|
|
|
end |
|
|
|
|
|
}, |
|
|
|
|
|
{"file that becomes unavailable at runtime should trigger an error message", |
|
|
|
|
|
fun() -> |
|
|
|
|
|
gen_event:add_handler(lager_event, lager_file_backend, [{"test.log", info}]), |
|
|
|
|
|
?assertEqual(0, lager_test_backend:count()), |
|
|
|
|
|
lager:log(error, self(), "Test message"), |
|
|
|
|
|
?assertEqual(1, lager_test_backend:count()), |
|
|
|
|
|
file:delete("test.log"), |
|
|
|
|
|
file:write_file("test.log", ""), |
|
|
|
|
|
{ok, FInfo} = file:read_file_info("test.log"), |
|
|
|
|
|
file:write_file_info("test.log", FInfo#file_info{mode = 0}), |
|
|
|
|
|
lager:log(error, self(), "Test message"), |
|
|
|
|
|
timer:sleep(100), |
|
|
|
|
|
?assertEqual(3, lager_test_backend:count()), |
|
|
|
|
|
lager_test_backend:pop(), |
|
|
|
|
|
lager_test_backend:pop(), |
|
|
|
|
|
{_Level, _Time, [_, _, Message]} = lager_test_backend:pop(), |
|
|
|
|
|
?assertEqual("Failed to reopen log file test.log with error permission denied", lists:flatten(Message)) |
|
|
|
|
|
end |
|
|
|
|
|
}, |
|
|
|
|
|
{"unavailable files that are fixed at runtime should start having log messages written", |
|
|
|
|
|
fun() -> |
|
|
|
|
|
{ok, FInfo} = file:read_file_info("test.log"), |
|
|
|
|
|
OldPerms = FInfo#file_info.mode, |
|
|
|
|
|
file:write_file_info("test.log", FInfo#file_info{mode = 0}), |
|
|
|
|
|
gen_event:add_handler(lager_event, lager_file_backend, [{"test.log", info}]), |
|
|
|
|
|
?assertEqual(1, lager_test_backend:count()), |
|
|
|
|
|
{_Level, _Time, [_, _, Message]} = lager_test_backend:pop(), |
|
|
|
|
|
?assertEqual("Failed to open log file test.log with error permission denied", lists:flatten(Message)), |
|
|
|
|
|
file:write_file_info("test.log", FInfo#file_info{mode = OldPerms}), |
|
|
|
|
|
lager:log(error, self(), "Test message"), |
|
|
|
|
|
{ok, Bin} = file:read_file("test.log"), |
|
|
|
|
|
Pid = pid_to_list(self()), |
|
|
|
|
|
?assertMatch([_, _, "[error]", Pid, "Test message\n"], re:split(Bin, " ", [{return, list}, {parts, 5}])) |
|
|
|
|
|
end |
|
|
|
|
|
}, |
|
|
|
|
|
{"external logfile rotation/deletion should be handled", |
|
|
|
|
|
fun() -> |
|
|
|
|
|
gen_event:add_handler(lager_event, lager_file_backend, [{"test.log", info}]), |
|
|
|
|
|
?assertEqual(0, lager_test_backend:count()), |
|
|
|
|
|
lager:log(error, self(), "Test message1"), |
|
|
|
|
|
?assertEqual(1, lager_test_backend:count()), |
|
|
|
|
|
file:delete("test.log"), |
|
|
|
|
|
file:write_file("test.log", ""), |
|
|
|
|
|
lager:log(error, self(), "Test message2"), |
|
|
|
|
|
{ok, Bin} = file:read_file("test.log"), |
|
|
|
|
|
Pid = pid_to_list(self()), |
|
|
|
|
|
?assertMatch([_, _, "[error]", Pid, "Test message2\n"], re:split(Bin, " ", [{return, list}, {parts, 5}])), |
|
|
|
|
|
file:rename("test.log", "test.log.0"), |
|
|
|
|
|
lager:log(error, self(), "Test message3"), |
|
|
|
|
|
{ok, Bin2} = file:read_file("test.log"), |
|
|
|
|
|
?assertMatch([_, _, "[error]", Pid, "Test message3\n"], re:split(Bin2, " ", [{return, list}, {parts, 5}])) |
|
|
|
|
|
end |
|
|
|
|
|
}, |
|
|
|
|
|
{"runtime level changes", |
|
|
|
|
|
fun() -> |
|
|
|
|
|
gen_event:add_handler(lager_event, lager_file_backend, [{"test.log", info}]), |
|
|
|
|
|
?assertEqual(0, lager_test_backend:count()), |
|
|
|
|
|
lager:log(info, self(), "Test message1"), |
|
|
|
|
|
lager:log(error, self(), "Test message2"), |
|
|
|
|
|
{ok, Bin} = file:read_file("test.log"), |
|
|
|
|
|
Lines = length(re:split(Bin, "\n", [{return, list}, trim])), |
|
|
|
|
|
?assertEqual(Lines, 2), |
|
|
|
|
|
?assertEqual(ok, lager:set_loglevel(lager_file_backend, "test.log", warning)), |
|
|
|
|
|
lager:log(info, self(), "Test message3"), %% this won't get logged |
|
|
|
|
|
lager:log(error, self(), "Test message4"), |
|
|
|
|
|
{ok, Bin2} = file:read_file("test.log"), |
|
|
|
|
|
Lines2 = length(re:split(Bin2, "\n", [{return, list}, trim])), |
|
|
|
|
|
?assertEqual(Lines2, 3) |
|
|
|
|
|
end |
|
|
|
|
|
}, |
|
|
|
|
|
{"invalid runtime level changes", |
|
|
|
|
|
fun() -> |
|
|
|
|
|
gen_event:add_handler(lager_event, lager_file_backend, [{"test.log", info}]), |
|
|
|
|
|
?assertEqual({error, bad_identifier}, lager:set_loglevel(lager_file_backend, "test2.log", warning)), |
|
|
|
|
|
?assertEqual({error, missing_identifier}, lager:set_loglevel(lager_file_backend, warning)) |
|
|
|
|
|
end |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
] |
|
|
|
|
|
}. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-endif. |
|
|
-endif. |
|
|
|
|
|
|