Browse Source

Make highest log level be 0; add some helper macros

pull/4/head
Andrew Thompson 14 years ago
parent
commit
886d410eb9
8 changed files with 56 additions and 62 deletions
  1. +4
    -2
      src/error_logger_lager_h.erl
  2. +5
    -3
      src/lager.erl
  3. +1
    -1
      src/lager_console_backend.erl
  4. +4
    -10
      src/lager_crash_log.erl
  5. +16
    -22
      src/lager_file_backend.erl
  6. +5
    -5
      src/lager_transform.erl
  7. +16
    -16
      src/lager_util.erl
  8. +5
    -3
      test/lager_test_backend.erl

+ 4
- 2
src/error_logger_lager_h.erl View File

@ -23,6 +23,8 @@
-module(error_logger_lager_h).
-include("lager.hrl").
-behaviour(gen_event).
-export([init/1, handle_call/2, handle_event/2, handle_info/2, terminate/2,
@ -31,14 +33,14 @@
-export([format_reason/1]).
-define(LOG(Level, Pid, Msg),
case lager_util:level_to_num(Level) >= lager_mochiglobal:get(loglevel, 0) of
case ?SHOULD_LOG(Level) of
true ->
lager:log(Level, Pid, Msg);
_ -> ok
end).
-define(LOG(Level, Pid, Fmt, Args),
case lager_util:level_to_num(Level) >= lager_mochiglobal:get(loglevel, 0) of
case ?SHOULD_LOG(Level) of
true ->
lager:log(Level, Pid, Fmt, Args);
_ -> ok

+ 5
- 3
src/lager.erl View File

@ -18,6 +18,8 @@
-module(lager).
-include("lager.hrl").
%% API
-export([start/0,
log/7, log/8, log/3, log/4,
@ -93,7 +95,7 @@ set_loglevel(Handler, Ident, Level) when is_atom(Level) ->
get_loglevel(Handler) ->
case gen_event:call(lager_event, Handler, get_loglevel) of
X when is_integer(X) ->
lager_util:num_to_level(X);
?NUM2LEVEL(X);
Y -> Y
end.
@ -104,6 +106,6 @@ get_loglevels() ->
%% @private
minimum_loglevel([]) ->
9; %% higher than any log level, logging off
-1; %% lower than any log level, logging off
minimum_loglevel(Levels) ->
erlang:hd(lists:sort(Levels)).
erlang:hd(lists:reverse(lists:sort(Levels))).

+ 1
- 1
src/lager_console_backend.erl View File

@ -39,7 +39,7 @@ handle_call(_Request, State) ->
{ok, ok, State}.
%% @private
handle_event({log, Level, Time, Message}, #state{level=LogLevel} = State) when Level >= LogLevel ->
handle_event({log, Level, Time, Message}, #state{level=LogLevel} = State) when Level =< LogLevel ->
io:put_chars([Time, " ", Message, "\n"]),
{ok, State};
handle_event(_Event, State) ->

+ 4
- 10
src/lager_crash_log.erl View File

@ -22,6 +22,8 @@
-module(lager_crash_log).
-include("lager.hrl").
-behaviour(gen_server).
%% callbacks
@ -37,14 +39,6 @@
flap=false
}).
-define(LOG(Level, Format, Args),
case lager_util:level_to_num(Level) >= lager_mochiglobal:get(loglevel, 0) of
true ->
gen_event:notify(lager_event, {log, lager_util:level_to_num(Level),
lager_util:format_time(), [io_lib:format("[~p] ~p ", [Level, self()]), io_lib:format(Format, Args)]});
_ -> ok
end).
%% @private
start_link(Filename) ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [Filename], []).
@ -93,7 +87,7 @@ handle_cast({log, Event}, #state{name=Name, fd=FD, inode=Inode, flap=Flap} = Sta
NodeSuffix = other_node_suffix(Pid),
case file:write(NewFD, io_lib:format("~s~s~s", [Time, MsgStr, NodeSuffix])) of
{error, Reason} when Flap == false ->
?LOG(error, "Failed to write log message to file ~s: ~s", [Name, file:format_error(Reason)]),
?INT_LOG(error, "Failed to write log message to file ~s: ~s", [Name, file:format_error(Reason)]),
{noreply, State#state{fd=NewFD, inode=NewInode, flap=true}};
ok ->
{noreply, State#state{fd=NewFD, inode=NewInode, flap=false}};
@ -105,7 +99,7 @@ handle_cast({log, Event}, #state{name=Name, fd=FD, inode=Inode, flap=Flap} = Sta
true ->
{noreply, State};
_ ->
?LOG(error, "Failed to reopen logfile ~s with error ~w", [Name, file:format_info(Reason)]),
?INT_LOG(error, "Failed to reopen logfile ~s with error ~w", [Name, file:format_info(Reason)]),
{noreply, State#state{flap=true}}
end
end

+ 16
- 22
src/lager_file_backend.erl View File

@ -22,6 +22,8 @@
-module(lager_file_backend).
-include("lager.hrl").
-behaviour(gen_event).
-ifdef(TEST).
@ -43,14 +45,6 @@
flap=false :: boolean()
}).
-define(LOG(Level, Format, Args),
case lager_util:level_to_num(Level) >= lager_mochiglobal:get(loglevel, 0) of
true ->
gen_event:notify(lager_event, {log, lager_util:level_to_num(Level),
lager_util:format_time(), [io_lib:format("[~p] ~p ", [Level, self()]), io_lib:format(Format, Args)]});
_ -> ok
end).
%% @private
init(LogFiles) ->
Files = [begin
@ -58,7 +52,7 @@ init(LogFiles) ->
{ok, {FD, Inode}} ->
#file{name=Name, level=lager_util:level_to_num(Level), fd=FD, inode=Inode};
{error, Reason} ->
?LOG(error, "Failed to open log file ~s with error ~s",
?INT_LOG(error, "Failed to open log file ~s with error ~s",
[Name, file:format_error(Reason)]),
#file{name=Name, level=lager_util:level_to_num(Level), flap=true}
end
@ -77,15 +71,15 @@ handle_call({set_loglevel, Ident, Level}, #state{files=Files} = State) ->
_ ->
NewFiles = lists:map(
fun(#file{name=Name} = File) when Name == Ident ->
?LOG(notice, "Changed loglevel of ~s to ~p", [Ident, Level]),
?INT_LOG(notice, "Changed loglevel of ~s to ~p", [Ident, Level]),
File#file{level=lager_util:level_to_num(Level)};
(X) -> X
end, Files),
{ok, ok, State#state{files=NewFiles}}
end;
handle_call(get_loglevel, #state{files=Files} = State) ->
Result = lists:foldl(fun(#file{level=Level}, L) -> erlang:min(Level, L);
(_, L) -> L end, 9,
Result = lists:foldl(fun(#file{level=Level}, L) -> erlang:max(Level, L);
(_, L) -> L end, -1,
Files),
{ok, Result, State};
handle_call(_Request, State) ->
@ -94,7 +88,7 @@ handle_call(_Request, State) ->
%% @private
handle_event({log, Level, Time, Message}, #state{files=Files} = State) ->
NewFiles = lists:map(
fun(#file{level=L} = File) when Level >= L ->
fun(#file{level=L} = File) when Level =< L ->
write(File, Level, [Time, " ", Message, "\n"]);
(File) ->
File
@ -124,11 +118,11 @@ write(#file{name=Name, fd=FD, inode=Inode, flap=Flap} = File, Level, Msg) ->
{ok, {NewFD, NewInode}} ->
file:write(NewFD, Msg),
case Level of
_ when Level >= 4 ->
_ when Level =< ?ERROR ->
%% force a sync on any message at error severity or above
Flap2 = case file:datasync(NewFD) of
{error, Reason2} when Flap == false ->
?LOG(error, "Failed to write log message to file ~s: ~s", [Name, file:format_error(Reason2)]),
?INT_LOG(error, "Failed to write log message to file ~s: ~s", [Name, file:format_error(Reason2)]),
true;
ok ->
false;
@ -144,7 +138,7 @@ write(#file{name=Name, fd=FD, inode=Inode, flap=Flap} = File, Level, Msg) ->
true ->
File;
_ ->
?LOG(error, "Failed to reopen logfile ~s with error ~s", [Name, file:format_error(Reason)]),
?INT_LOG(error, "Failed to reopen logfile ~s with error ~s", [Name, file:format_error(Reason)]),
File#file{flap=true}
end
end.
@ -166,18 +160,18 @@ get_loglevel_test() ->
rotation_test() ->
{ok, {FD, Inode}} = lager_util:open_logfile("test.log", true),
?assertMatch(#file{name="test.log", level=0, fd=FD, inode=Inode},
write(#file{name="test.log", level=0, fd=FD, inode=Inode}, 0, "hello world")),
?assertMatch(#file{name="test.log", level=?DEBUG, fd=FD, inode=Inode},
write(#file{name="test.log", level=?DEBUG, fd=FD, inode=Inode}, 0, "hello world")),
file:delete("test.log"),
Result = write(#file{name="test.log", level=0, fd=FD, inode=Inode}, 0, "hello world"),
Result = write(#file{name="test.log", level=?DEBUG, fd=FD, inode=Inode}, 0, "hello world"),
%% assert file has changed
?assert(#file{name="test.log", level=0, fd=FD, inode=Inode} =/= Result),
?assertMatch(#file{name="test.log", level=0}, Result),
?assert(#file{name="test.log", level=?DEBUG, fd=FD, inode=Inode} =/= Result),
?assertMatch(#file{name="test.log", level=?DEBUG}, Result),
file:rename("test.log", "test.log.1"),
Result2 = write(Result, 0, "hello world"),
%% assert file has changed
?assert(Result =/= Result2),
?assertMatch(#file{name="test.log", level=0}, Result2),
?assertMatch(#file{name="test.log", level=?DEBUG}, Result2),
ok.
-endif.

+ 5
- 5
src/lager_transform.erl View File

@ -22,10 +22,10 @@
%% nothing wishes to consume the message.
-module(lager_transform).
-export([parse_transform/2]).
-define(LEVELS, [debug, info, notice, warning, error, critical, alert,
emergency]).
-include("lager.hrl").
-export([parse_transform/2]).
%% @private
parse_transform(AST, _Options) ->
@ -63,11 +63,11 @@ transform_statement({call, Line, {remote, Line1, {atom, Line2, lager},
%% a case to check the mochiglobal 'loglevel' key against the
%% message we're trying to log
{'case',Line,
{op,Line,'=<',
{op,Line,'>=',
{call,Line,
{remote,Line,{atom,Line,lager_mochiglobal},{atom,Line,get}},
[{atom,Line,loglevel},{integer,Line,0}]},
{integer, Line, lager_util:level_to_num(Severity)}},
{integer, Line, ?LEVEL2NUM(Severity)}},
[{clause,Line,
[{atom,Line,true}], %% yes, we log!
[],

+ 16
- 16
src/lager_util.erl View File

@ -24,23 +24,23 @@
levels() ->
[debug, info, notice, warning, error, critical, alert, emergency].
level_to_num(debug) -> 0;
level_to_num(info) -> 1;
level_to_num(notice) -> 2;
level_to_num(warning) -> 3;
level_to_num(error) -> 4;
level_to_num(critical) -> 5;
level_to_num(alert) -> 6;
level_to_num(emergency) -> 7.
level_to_num(debug) -> 7;
level_to_num(info) -> 6;
level_to_num(notice) -> 5;
level_to_num(warning) -> 4;
level_to_num(error) -> 3;
level_to_num(critical) -> 2;
level_to_num(alert) -> 1;
level_to_num(emergency) -> 0.
num_to_level(0) -> debug;
num_to_level(1) -> info;
num_to_level(2) -> notice;
num_to_level(3) -> warning;
num_to_level(4) -> error;
num_to_level(5) -> critical;
num_to_level(6) -> alert;
num_to_level(7) -> emergency.
num_to_level(7) -> debug;
num_to_level(6) -> info;
num_to_level(5) -> notice;
num_to_level(4) -> warning;
num_to_level(3) -> error;
num_to_level(2) -> critical;
num_to_level(1) -> alert;
num_to_level(0) -> emergency.
open_logfile(Name, Buffer) ->
case filelib:ensure_dir(Name) of

+ 5
- 3
test/lager_test_backend.erl View File

@ -16,6 +16,8 @@
-module(lager_test_backend).
-include("lager.hrl").
-behaviour(gen_event).
-export([init/1, handle_call/2, handle_event/2, handle_info/2, terminate/2,
@ -52,7 +54,7 @@ handle_call(_Request, State) ->
{ok, ok, State}.
handle_event({log, Level, Time, Message}, #state{level=LogLevel,
buffer=Buffer} = State) when Level >= LogLevel ->
buffer=Buffer} = State) when Level =< LogLevel ->
{ok, State#state{buffer=Buffer ++ [{Level, Time, Message}]}};
handle_event({log, _Level, _Time, _Message}, #state{ignored=Ignored} = State) ->
{ok, State#state{ignored=Ignored ++ [ignored]}};
@ -155,7 +157,7 @@ lager_test_() ->
lager:debug("this message will be ignored"),
?assertEqual(0, count()),
?assertEqual(0, count_ignored()),
lager_mochiglobal:put(loglevel, 0),
lager_mochiglobal:put(loglevel, ?DEBUG),
lager:debug("this message should be ignored"),
?assertEqual(0, count()),
?assertEqual(1, count_ignored()),
@ -553,7 +555,7 @@ error_logger_redirect_test_() ->
?assertEqual(1, count()),
?assertEqual(0, count_ignored()),
lager:set_loglevel(?MODULE, error),
lager_mochiglobal:put(loglevel, 0),
lager_mochiglobal:put(loglevel, ?DEBUG),
error_logger:info_report([hello, world]),
timer:sleep(100),
?assertEqual(1, count()),

Loading…
Cancel
Save