%% Copyright (c) 2011-2012 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.
|
|
|
|
%% @doc Lager's top level supervisor.
|
|
|
|
%% @private
|
|
|
|
-module(lager_sup).
|
|
|
|
-behaviour(supervisor).
|
|
|
|
%% API
|
|
-export([start_link/0]).
|
|
|
|
%% Callbacks
|
|
-export([init/1]).
|
|
|
|
start_link() ->
|
|
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
|
|
|
|
init([]) ->
|
|
%% set up the config, is safe even during relups
|
|
lager_config:new(),
|
|
%% TODO:
|
|
%% Always start lager_event as the default and make sure that
|
|
%% other gen_event stuff can start up as needed
|
|
%%
|
|
%% Maybe a new API to handle the sink and its policy?
|
|
Children = [
|
|
{lager, {gen_event, start_link, [{local, lager_event}]},
|
|
permanent, 5000, worker, dynamic},
|
|
{lager_handler_watcher_sup, {lager_handler_watcher_sup, start_link, []},
|
|
permanent, 5000, supervisor, [lager_handler_watcher_sup]}],
|
|
|
|
CrashLog = decide_crash_log(application:get_env(lager, crash_log, false)),
|
|
|
|
{ok, {{one_for_one, 10, 60},
|
|
Children ++ CrashLog
|
|
}}.
|
|
|
|
validate_positive({ok, Val}, _Default) when is_integer(Val) andalso Val >= 0 ->
|
|
Val;
|
|
validate_positive(_Val, Default) ->
|
|
Default.
|
|
|
|
determine_rotation_date({ok, ""}) ->
|
|
undefined;
|
|
determine_rotation_date({ok, Val3}) ->
|
|
case lager_util:parse_rotation_date_spec(Val3) of
|
|
{ok, Spec} -> Spec;
|
|
{error, _} ->
|
|
error_logger:error_msg("Invalid date spec for "
|
|
"crash log ~p~n", [Val3]),
|
|
undefined
|
|
end;
|
|
determine_rotation_date(_) ->
|
|
undefined.
|
|
|
|
determine_rotator_mod({ok, Mod}, _Default) when is_atom(Mod) ->
|
|
Mod;
|
|
determine_rotator_mod(_, Default) ->
|
|
Default.
|
|
|
|
decide_crash_log(undefined) ->
|
|
[];
|
|
decide_crash_log(false) ->
|
|
[];
|
|
decide_crash_log(File) ->
|
|
MaxBytes = validate_positive(application:get_env(lager, crash_log_msg_size), 65536),
|
|
RotationSize = validate_positive(application:get_env(lager, crash_log_size), 0),
|
|
RotationCount = validate_positive(application:get_env(lager, crash_log_count), 0),
|
|
|
|
RotationDate = determine_rotation_date(application:get_env(lager, crash_log_date)),
|
|
RotationMod = determine_rotator_mod(application:get_env(lager, crash_log_rotator), lager_rotator_default),
|
|
|
|
|
|
[{lager_crash_log, {lager_crash_log, start_link, [File, MaxBytes,
|
|
RotationSize, RotationDate, RotationCount, RotationMod]},
|
|
permanent, 5000, worker, [lager_crash_log]}].
|