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

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

再来看看另一段代码

lager:clear_all_traces/0 代码如下

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)


好拉,就是这么简单.我只提供一个小思路,有不成熟的地方望大家多指点,具体代码就不贴了。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值