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)].
- erlang large日志系统代码阅读(一):lager_app
- 代码阅读日志1
- ngix代码阅读(一)
- 《代码阅读》读书笔记(一)
- erlang的类型系统一
- x265代码阅读(一):cudata.cpp代码阅读
- 小叶代码日志(一)
- Log日志系统(一)
- Erlang服务器代码的分析与学习(一)
- Erlang入门(一)
- Erlang入门(一)
- Erlang 配置(一)
- erlang入门(一)
- Erlang入门(一)
- Erlang 入门(一)
- 如何有效阅读他人代码(一)
- ContactManager示例代码阅读拓展(一)
- filezilla client代码阅读笔记(一)
- QSC and Master 区间dp
- 《程序员面试笔试宝典》C知识归纳
- Spring通过ApplicationContextAware获得bean的方法、获取数据库连接的方法、获取Appl...
- 指定线程在特定核心
- CoordinatorLayout配合AppBarLayout,Toolbar和TabLayout的使用
- erlang large日志系统代码阅读(一):lager_app
- 火狐HttpTool使用方法post
- HTML5+JS游戏开发模块----canvas图片拖放
- easyUI 设置datagrid的行高 + 文字超宽换行
- 成功的境界
- 深入浅出MFC:Windows程序的生与死
- UVa 11181 Probability|Given
- 欢迎使用CSDN-markdown编辑器
- android三星等手机拍照自动旋转问题与解决