Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:23
erlang
3511-Allow-metadata-and-ignore-to-be-computed-i...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 3511-Allow-metadata-and-ignore-to-be-computed-in-logger-f.patch of Package erlang
From 73f04748306e21e46b1f7c2c220bce0df2115d0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= <jose.valim@dashbit.co> Date: Sat, 22 Aug 2020 19:47:50 +0200 Subject: [PATCH 1/2] Allow metadata and ignore to be computed in logger funs This commit allows the logger metadata to be computed lazily via the logger `msg_fun`. The `msg_fun` itself can also return `ignore`. These features are useful when computing the metadata or if the message should be logged or not is expensive and you want to do so only after the log level match. --- lib/kernel/doc/src/logger.xml | 6 +++++ lib/kernel/src/logger.erl | 42 ++++++++++++++++++++------------ lib/kernel/test/logger_SUITE.erl | 10 ++++++++ 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/lib/kernel/doc/src/logger.xml b/lib/kernel/doc/src/logger.xml index 801a2c1193..2f2417690b 100644 --- a/lib/kernel/doc/src/logger.xml +++ b/lib/kernel/doc/src/logger.xml @@ -244,6 +244,12 @@ logger:error("error happened because: ~p", [Reason]). % Without macro <p></p> </desc> </datatype> + <datatype> + <name name="msg_fun_return"/> + <desc> + <p></p> + </desc> + </datatype> <datatype> <name name="olp_config"/> <desc> diff --git a/lib/kernel/src/logger.erl b/lib/kernel/src/logger.erl index 167637b8b4..eadf15f108 100644 --- a/lib/kernel/src/logger.erl +++ b/lib/kernel/src/logger.erl @@ -86,9 +86,11 @@ -type report_cb_config() :: #{depth := pos_integer() | unlimited, chars_limit := pos_integer() | unlimited, single_line := boolean()}. --type msg_fun() :: fun((term()) -> {io:format(),[term()]} | - report() | - unicode:chardata()). +-type msg_fun() :: fun((term()) -> msg_fun_return() | {msg_fun_return(), metadata()}). +-type msg_fun_return() :: {io:format(),[term()]} | + report() | + unicode:chardata() | + ignore. -type metadata() :: #{pid => pid(), gl => pid(), time => timestamp(), @@ -1048,19 +1050,12 @@ do_log(Level,Msg,Meta) -> report() | unicode:chardata(), Meta :: metadata(). -log_allowed(Location,Level,{Fun,FunArgs},Meta) when is_function(Fun,1) -> +log_allowed(Location,Level,{Fun,FunArgs}=FunCall,Meta) when is_function(Fun,1) -> try Fun(FunArgs) of - Msg={Format,Args} when ?IS_FORMAT(Format), is_list(Args) -> - log_allowed(Location,Level,Msg,Meta); - Report when ?IS_REPORT(Report) -> - log_allowed(Location,Level,Report,Meta); - String when ?IS_STRING(String) -> - log_allowed(Location,Level,String,Meta); - Other -> - log_allowed(Location,Level, - {"LAZY_FUN ERROR: ~tp; Returned: ~tp", - [{Fun,FunArgs},Other]}, - Meta) + {FunRes, #{} = FunMeta} -> + log_fun_allowed(Location, Level, FunRes, maps:merge(Meta, FunMeta), FunCall); + FunRes -> + log_fun_allowed(Location, Level, FunRes, Meta, FunCall) catch C:R -> log_allowed(Location,Level, {"LAZY_FUN CRASH: ~tp; Reason: ~tp", @@ -1083,6 +1078,23 @@ log_allowed(Location,Level,Msg,Meta0) when is_map(Meta0) -> end, do_log_allowed(Level,Msg,Meta,Tid,PrimaryConfig). +log_fun_allowed(Location, Level, FunRes, Meta, FunCall) -> + case FunRes of + ignore -> + ok; + Msg={Format,Args} when ?IS_FORMAT(Format), is_list(Args) -> + log_allowed(Location,Level,Msg,Meta); + Report when ?IS_REPORT(Report) -> + log_allowed(Location,Level,Report,Meta); + String when ?IS_STRING(String) -> + log_allowed(Location,Level,String,Meta); + Other -> + log_allowed(Location,Level, + {"LAZY_FUN ERROR: ~tp; Returned: ~tp", + [FunCall,Other]}, + Meta) + end. + do_log_allowed(Level,{Format,Args}=Msg,Meta,Tid,Config) when ?IS_LEVEL(Level), ?IS_FORMAT(Format), diff --git a/lib/kernel/test/logger_SUITE.erl b/lib/kernel/test/logger_SUITE.erl index 8513cf2936..d1e7b1a4fc 100644 --- a/lib/kernel/test/logger_SUITE.erl +++ b/lib/kernel/test/logger_SUITE.erl @@ -1341,6 +1341,16 @@ test_log_function(Level) -> logger:log(Level,F2=fun(x) -> erlang:error(fun_that_crashes) end,x,#{}), ok = check_logged(Level,"LAZY_FUN CRASH: ~tp; Reason: ~tp", [{F2,x},{error,fun_that_crashes}],#{}), + logger:log(Level,fun(x) -> {{"~w: ~w ~w",[Level,fun_to_fa,meta]}, #{my=>override}} end, + x, #{my=>meta}), + ok = check_logged(Level,"~w: ~w ~w",[Level,fun_to_fa,meta],#{my=>override}), + logger:log(Level,fun(x) -> {#{Level=>fun_to_r,meta=>true}, #{my=>override}} end, + x, #{my=>meta}), + ok = check_logged(Level,#{Level=>fun_to_r,meta=>true},#{my=>override}), + logger:log(Level,fun(x) -> {<<"fun_to_s">>,#{my=>override}} end,x,#{my=>meta}), + ok = check_logged(Level,<<"fun_to_s">>,#{my=>override}), + logger:log(Level, fun(x) -> ignore end, x, #{}), + ok = check_no_log(), ok. test_macros(emergency=Level) -> -- 2.26.2
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor