| %% Copyright (c) 2011 Basho Technologies, Inc. All Rights Reserved. |
| %% |
| %% This file is provided to you under the Apache License, |
| %% Version 2.0 (the "License"); you may not use this file |
| %% except in compliance with the License. You may obtain |
| %% a copy of the License at |
| %% |
| %% http://www.apache.org/licenses/LICENSE-2.0 |
| %% |
| %% Unless required by applicable law or agreed to in writing, |
| %% software distributed under the License is distributed on an |
| %% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| %% KIND, either express or implied. See the License for the |
| %% specific language governing permissions and limitations |
| %% under the License. |
| |
| -define(LEVELS, |
| [debug, info, notice, warning, error, critical, alert, emergency]). |
| |
| -define(DEBUG, 7). |
| -define(INFO, 6). |
| -define(NOTICE, 5). |
| -define(WARNING, 4). |
| -define(ERROR, 3). |
| -define(CRITICAL, 2). |
| -define(ALERT, 1). |
| -define(EMERGENCY, 0). |
| -define(LOG_NONE, -1). |
| |
| -define(LEVEL2NUM(Level), |
| case Level of |
| debug -> ?DEBUG; |
| info -> ?INFO; |
| notice -> ?NOTICE; |
| warning -> ?WARNING; |
| error -> ?ERROR; |
| critical -> ?CRITICAL; |
| alert -> ?ALERT; |
| emergency -> ?EMERGENCY |
| end). |
| |
| -define(NUM2LEVEL(Num), |
| case Num of |
| ?DEBUG -> debug; |
| ?INFO -> info; |
| ?NOTICE -> notice; |
| ?WARNING -> warning; |
| ?ERROR -> error; |
| ?CRITICAL -> critical; |
| ?ALERT -> alert; |
| ?EMERGENCY -> emergency |
| end). |
| |
| -define(SHOULD_LOG(Level), |
| lager_util:level_to_num(Level) =< lager_mochiglobal:get(loglevel, ?LOG_NONE)). |
| |
| -define(NOTIFY(Level, Pid, Format, Args), |
| gen_event:notify(lager_event, {log, lager_util:level_to_num(Level), |
| lager_util:format_time(), [io_lib:format("[~p] ", [Level]), |
| io_lib:format("~p ", [Pid]), io_lib:format(Format, Args)]})). |
| |
| %% FOR INTERNAL USE ONLY |
| %% internal non-blocking logging call |
| %% there's some special handing for when we try to log (usually errors) while |
| %% lager is still starting. |
| -ifdef(TEST). |
| -define(INT_LOG(Level, Format, Args), |
| case ?SHOULD_LOG(Level) of |
| true -> |
| ?NOTIFY(Level, self(), Format, Args); |
| _ -> |
| ok |
| end). |
| -else. |
| -define(INT_LOG(Level, Format, Args), |
| Self = self(), |
| %% do this in a spawn so we don't cause a deadlock calling gen_event:which_handlers |
| %% from a gen_event handler |
| spawn(fun() -> |
| case catch(gen_event:which_handlers(lager_event)) of |
| X when X == []; X == {'EXIT', noproc} -> |
| %% there's no handlers yet or lager isn't running, try again |
| %% in half a second. |
| timer:sleep(500), |
| ?NOTIFY(Level, Self, Format, Args); |
| _ -> |
| case ?SHOULD_LOG(Level) of |
| true -> |
| ?NOTIFY(Level, Self, Format, Args); |
| _ -> |
| ok |
| end |
| end |
| end)). |
| -endif. |