%% 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]}].