%% %% %CopyrightBegin% %% %% Copyright Ericsson AB 2018. All Rights Reserved. %% %% Licensed 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. %% %% %CopyrightEnd% %% -module(logger_simple_SUITE). -compile(export_all). -include_lib("common_test/include/ct.hrl"). -include_lib("kernel/include/logger.hrl"). -include_lib("kernel/src/logger_internal.hrl"). -define(check_no_log,[] = test_server:messages_get()). -define(check(Expected), receive {log,Expected} -> [] = test_server:messages_get() after 1000 -> ct:fail({report_not_received, {line,?LINE}, {expected,Expected}, {got,test_server:messages_get()}}) end). -define(str,"Log from "++atom_to_list(?FUNCTION_NAME)++ ":"++integer_to_list(?LINE)). -define(map_rep,#{function=>?FUNCTION_NAME, line=>?LINE}). -define(keyval_rep,[{function,?FUNCTION_NAME}, {line,?LINE}]). suite() -> [{timetrap,{seconds,30}}]. init_per_suite(Config) -> #{handlers:=Hs0} = logger:i(), Hs = lists:keydelete(cth_log_redirect,1,Hs0), [ok = logger:remove_handler(Id) || {Id,_,_} <- Hs], Env = [{App,Key,application:get_env(App,Key)} || {App,Key} <- [{kernel,logger_dest}, {kernel,logger_level}]], [{env,Env},{logger,Hs}|Config]. end_per_suite(Config) -> [application:set_env(App,Key,Val) || {App,Key,Val} <- ?config(env,Config)], Hs = ?config(logger,Config), [ok = logger:add_handler(Id,Mod,C) || {Id,Mod,C} <- Hs], ok. init_per_group(_Group, Config) -> Config. end_per_group(_Group, _Config) -> ok. init_per_testcase(_TestCase, Config) -> Config. end_per_testcase(Case, Config) -> try apply(?MODULE,Case,[cleanup,Config]) catch error:undef -> ok end, ok. groups() -> []. all() -> [start_stop, get_buffer, replace_file, replace_disk_log ]. start_stop(_Config) -> undefined = whereis(logger_simple), register(logger_simple,self()), {error,_} = logger:add_handler(logger_simple, logger_simple, #{filter_default=>log}), unregister(logger_simple), ok = logger:add_handler(logger_simple,logger_simple,#{filter_default=>log}), Pid = whereis(logger_simple), true = is_pid(Pid), ok = logger:remove_handler(logger_simple), false = is_pid(whereis(logger_simple)), ok. start_stop(cleanup,_Config) -> logger:remove_handler(logger_simple). get_buffer(_Config) -> %% Start simple without buffer ok = logger:add_handler(logger_simple,logger_simple, #{filter_default=>log}), logger:emergency(?str), logger:alert(?str,[]), logger:error(?map_rep), logger:info(?keyval_rep), {ok,[]} = logger_simple:get_buffer(), % no buffer ok = logger:remove_handler(logger_simple), %% Start with buffer ok = logger:add_handler(logger_simple,logger_simple, #{filter_default=>log, logger_simple=>#{buffer=>true}}), logger:emergency(M1=?str), logger:alert(M2=?str,[]), logger:error(M3=?map_rep), logger:info(M4=?keyval_rep), logger:info(M41=?keyval_rep++[not_key_val]), error_logger:error_report(some_type,M5=?map_rep), error_logger:warning_report("some_type",M6=?map_rep), logger:critical(M7=?str,[A7=?keyval_rep]), logger:notice(M8=["fake",string,"line:",?LINE]), {ok,Buffered1} = logger_simple:get_buffer(), [#{level:=emergency,msg:={string,M1}}, #{level:=alert,msg:={M2,[]}}, #{level:=error,msg:={report,M3}}, #{level:=info,msg:={report,M4}}, #{level:=info,msg:={report,M41}}, #{level:=error,msg:={report,#{label:={error_logger,error_report}, report:=M5}}}, #{level:=warning,msg:={report,#{label:={error_logger,warning_report}, report:=M6}}}, #{level:=critical,msg:={M7,[A7]}}, #{level:=notice,msg:={string,M8}}] = Buffered1, %% Keep logging - should not buffer any more logger:emergency(?str), logger:alert(?str,[]), logger:error(?map_rep), logger:info(?keyval_rep), {ok,[]} = logger_simple:get_buffer(), ok = logger:remove_handler(logger_simple), %% Fill buffer and drop ok = logger:add_handler(logger_simple,logger_simple, #{filter_default=>log, logger_simple=>#{buffer=>true}}), logger:emergency(M9=?str), M10=?str, [logger:info(M10) || _ <- lists:seq(1,8)], logger:error(M11=?str), logger:error(?str), logger:error(?str), {ok,Buffered3} = logger_simple:get_buffer(), 11 = length(Buffered3), [#{level:=emergency,msg:={string,M9}}, #{level:=info,msg:={string,M10}}, #{level:=info,msg:={string,M10}}, #{level:=info,msg:={string,M10}}, #{level:=info,msg:={string,M10}}, #{level:=info,msg:={string,M10}}, #{level:=info,msg:={string,M10}}, #{level:=info,msg:={string,M10}}, #{level:=info,msg:={string,M10}}, #{level:=error,msg:={string,M11}}, #{level:=info,msg:={"Simple handler buffer full, dropped ~w messages",[2]}}] = Buffered3, ok. get_buffer(cleanup,_Config) -> logger:remove_handler(logger_simple). replace_file(Config) -> ok = logger:add_handler(logger_simple,logger_simple, #{filter_default=>log, logger_simple=>#{buffer=>true}}), logger:emergency(M1=?str), logger:alert(M2=?str,[]), logger:error(?map_rep), logger:info(?keyval_rep), undefined = whereis(?STANDARD_HANDLER), PrivDir = ?config(priv_dir,Config), File = filename:join(PrivDir,atom_to_list(?FUNCTION_NAME)++".log"), application:set_env(kernel,logger_dest,{file,File}), application:set_env(kernel,logger_level,info), ok = logger:setup_standard_handler(), true = is_pid(whereis(?STANDARD_HANDLER)), ok = logger_std_h:filesync(?STANDARD_HANDLER), {ok,Bin} = file:read_file(File), Lines = [unicode:characters_to_list(L) || L <- binary:split(Bin,<<"\n">>,[global,trim])], ["=EMERGENCY REPORT===="++_, M1, "=ALERT REPORT===="++_, M2, "=ERROR REPORT===="++_, _, _, "=INFO REPORT===="++_, _, _] = Lines, ok. replace_file(cleanup,_Config) -> logger:remove_handler(?STANDARD_HANDLER), logger:remove_handler(logger_simple). replace_disk_log(Config) -> ok = logger:add_handler(logger_simple,logger_simple, #{filter_default=>log, logger_simple=>#{buffer=>true}}), logger:emergency(M1=?str), logger:alert(M2=?str,[]), logger:error(?map_rep), logger:info(?keyval_rep), undefined = whereis(?STANDARD_HANDLER), PrivDir = ?config(priv_dir,Config), File = filename:join(PrivDir,atom_to_list(?FUNCTION_NAME)), application:set_env(kernel,logger_dest,{disk_log,File}), application:set_env(kernel,logger_level,info), ok = logger:setup_standard_handler(), true = is_pid(whereis(?STANDARD_HANDLER)), ok = logger_disk_log_h:disk_log_sync(?STANDARD_HANDLER), {ok,Bin} = file:read_file(File++".1"), Lines = [unicode:characters_to_list(L) || L <- binary:split(Bin,<<"\n">>,[global,trim])], ["=EMERGENCY REPORT===="++_, M1, "=ALERT REPORT===="++_, M2, "=ERROR REPORT===="++_, _, _, "=INFO REPORT===="++_, _, _|_] = Lines, % the tail might be an info report about opening the disk log ok. replace_disk_log(cleanup,_Config) -> logger:remove_handler(?STANDARD_HANDLER), logger:remove_handler(logger_simple).