您的位置:首页 > 其它

让lager的日志文件按日期滚动起来

2015-02-08 19:37 447 查看
lager是一个很强大得日志系统,但是在实际使用的时候发现lager貌似不能在运行后随意的更改错误日志的文件名称。

这是因为lager在为它自己添加event_handler的时候,是直接将日志输出文件名作为handler的名称的一部分输入进去得。

lager:status/0 代码如下



status() ->
Handlers = gen_event:which_handlers(lager_event),
TraceCount = case length(element(2, lager_config:get(loglevel))) of
0 -> 1;
N -> N
end,
Status = ["Lager status:\n",
[begin
Level = get_loglevel(Handler),
case Handler of
{lager_file_backend, File} ->
io_lib:format("File ~s at level ~p\n", [File, Level]);
lager_console_backend ->
io_lib:format("Console at level ~p\n", [Level]);
_ ->
[]
end
            end || Handler <- Handlers],
"Active Traces:\n",
[begin
LevelName = case Level of
{mask, Mask} ->
case lager_util:mask_to_levels(Mask) of
[] -> none;
Levels -> hd(Levels)
end;
Num ->
lager_util:num_to_level(Num)
end,
io_lib:format("Tracing messages matching ~p at level ~p to ~p\n",
[Filter, LevelName, Destination])
end || {Filter, Level, Destination} <- element(2, lager_config:get(loglevel))],
[
"Tracing Reductions:\n",
case ?DEFAULT_TRACER:info('query') of
{null, false} -> "";
Query -> io_lib:format("~p~n", [Query])
end
],
[
"Tracing Statistics:\n ",
[ begin
[" ", atom_to_list(Table), ": ",
integer_to_list(?DEFAULT_TRACER:info(Table) div TraceCount),
"\n"]
end || Table <- [input, output, filter] ]
]],
io:put_chars(Status).


我们看到handler的两个匹配

{lager_file_backend, File}, lager_console_backend


再来看看另一段代码

[b]lager:clear_all_traces/0 代码如下[/b]

98d3

clear_all_traces() ->
{Level, _Traces} = lager_config:get(loglevel),
_ = lager_util:trace_filter(none),
lager_config:set(loglevel, {Level, []}),
lists:foreach(fun(Handler) ->
case get_loglevel(Handler) of
none ->
gen_event:delete_handler(lager_event, Handler, []);
_ ->
ok
end
      end, gen_event:which_handlers(lager_event)).

我们看到这个地方,清除handler的时候是整个删掉了event_handler。所以我的做法是,更改文件名称的时候就直接删除掉之前定义个该级别的Handler.

以下是我事先该功能的一小部分代码段,仅供大家参考,望高人指正.

% 获取所有得Handler
Handlers = gen_event:which_handlers(lager_event),
% 获取当前级别的日志Handler
{ok, TargetLevelHandlers} = getLevelHandler(Handlers, LogLevel),
% 增加新得Handler
gen_event:add_handler(lager_event, {lager_file_backend, LogFile}, [{file, LogFileName}, {level, LogLevel}]),
% 删除旧的Handler
[begin
     % 删除旧的handler
gen_event:delete_handler(lager_event, Handler, []),
[]
end||Handler<-TargetLevelHandlers],
% 设定日志级别
lager:set_loglevel({lager_file_backend, LogFile}, LogLevel)


好拉,就是这么简单.我只提供一个小思路,有不成熟的地方望大家多指点,具体代码就不贴了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  erlang lager logger