erlang large日志系统代码阅读(一):lager_app

来源:互联网 发布:英语基础自学软件 编辑:程序博客网 时间:2024/04/29 10:25

http://i.mtime.com/844165/blog/7531544/


-module(lager_app).


-behaviour(application).

-include("lager.hrl").


-export([start/0,

         start/2,

         stop/1]).


%启动lager app

start() ->

    application:start(lager).


start(_StartType, _StartArgs) ->

    {ok, Pid} = lager_sup:start_link(), %启动 lager_event进程、lager_handler_watcher_sup 进程,并在必要的情况下启动 lager_crash_log 进程

    Handlers = case application:get_env(lager, handlers) of %获取lager handlers配置

        undefined ->

            [{lager_console_backend, info},

                {lager_file_backend, [{"log/error.log", error, 10485760, "", 5},

                        {"log/console.log", info, 10485760, "", 5}]}];

        {ok, Val} ->

            Val

    end,


    %% handlers failing to start are handled in the handler_watcher

    %根据配置启动各个lager_event handler监控进程并向lager_event进程注册handler

    _ = [supervisor:start_child(lager_handler_watcher_sup, [lager_event, Module, Config]) ||

        {Module, Config} <- expand_handlers(Handlers)],


    %% mask the messages we have no use for

    MinLog = lager:minimum_loglevel(lager:get_loglevels()),%获取各个handler定义的log_level中最小level,并计算掩码,凡是低于该level的消息一概不处理

    {_, Traces} = lager_config:get(loglevel), %获取自定义属性

    lager_config:set(loglevel, {MinLog, Traces}), %重设log_level


    SavedHandlers =

        case application:get_env(lager, error_logger_redirect) of %检查lager是否对error_logger进行消息重定向

            {ok, false} ->

                [];

            _ ->

                case application:get_env(lager, error_logger_whitelist) of%获取白名单

                    undefined ->

                        WhiteList = [];

                    {ok, WhiteList} ->

                        WhiteList

                end,


                %如果对error_logger进行消息重定向,启动error_logger的监控进程并向error_logger进程注册handler,如果注册成功,将白名单和

                %error_logger_lager_h以外的handler从error_logger进程中删除

                case supervisor:start_child(lager_handler_watcher_sup, [error_logger, error_logger_lager_h, []]) of

                    {ok, _} ->

                        [begin error_logger:delete_report_handler(X), X end ||

                            X <- gen_event:which_handlers(error_logger) -- [error_logger_lager_h | WhiteList]];

                    {error, _} ->

                        []

                end

        end,


    {ok, Pid, SavedHandlers}.



stop(Handlers) ->

    lists:foreach(fun(Handler) ->

          error_logger:add_report_handler(Handler)

      end, Handlers).


%将handler信息转化为{{Module, Backend}, Config}或者{Module, Backend}形式

expand_handlers([]) ->

    [];

expand_handlers([{lager_file_backend, Configs}|T]) ->

    [ {lager_file_backend:config_to_id(Config), Config} || Config <- Configs] ++

      expand_handlers(T);

expand_handlers([{Mod, Config}|T]) when is_atom(Mod) ->

    %% allow the backend to generate a gen_event handler id, if it wants to

    _ = code:load_file(Mod),

    Res = case erlang:function_exported(Mod, config_to_id, 1) of

        true ->

            {Mod:config_to_id(Config), Config};

        false ->

            {Mod, Config}

    end,

    [Res | expand_handlers(T)];

expand_handlers([H|T]) ->

    [H | expand_handlers(T)].

 

0 0
原创粉丝点击