diff --git a/include/logger.hrl b/include/logger.hrl index 503b6cf21..1cf5facc6 100644 --- a/include/logger.hrl +++ b/include/logger.hrl @@ -14,6 +14,8 @@ %% debug | info | notice | warning | error | critical | alert | emergency +-compile({parse_transform, emqx_logger}). + -define(DEBUG(Format), ?LOG(debug, Format, [])). -define(DEBUG(Format, Args), ?LOG(debug, Format, Args)). @@ -39,5 +41,5 @@ -define(LOG(Level, Format, Args), begin - (logger:log(Level,#{},#{report_cb => fun(_) -> {(Format), (Args)} end})) + (logger:log(Level,#{},#{report_cb => fun(_) -> {'$logger_header'()++(Format), (Args)} end})) end). diff --git a/src/emqx_logger.erl b/src/emqx_logger.erl index b77fa2d70..0a663de20 100644 --- a/src/emqx_logger.erl +++ b/src/emqx_logger.erl @@ -48,6 +48,8 @@ , get_log_handler/1 ]). +-export([parse_transform/2]). + %%------------------------------------------------------------------------------ %% APIs %%------------------------------------------------------------------------------ @@ -120,6 +122,9 @@ set_log_level(Level) -> {error, Error} -> {error, {primary_logger_level, Error}} end. +parse_transform(AST, _Opts) -> + trans(AST, "", []). + %%------------------------------------------------------------------------------ %% Internal Functions %%------------------------------------------------------------------------------ @@ -160,3 +165,26 @@ rollback([{ID, Level} | List]) -> rollback(List); rollback([]) -> ok. +%% Generate a function '$logger_header'/0 into the source code +trans([], LogHeader, ResAST) -> + lists:reverse([header_fun(LogHeader) | ResAST]); +trans([{eof, L} | AST], LogHeader, ResAST) -> + lists:reverse([{eof, L}, header_fun(LogHeader) | ResAST]) ++ AST; +trans([{attribute, _, module, _Mod} = M | AST], Header, ResAST) -> + trans(AST, Header, [export_header_fun(), M | ResAST]); +trans([{attribute, _, logger_header, Header} | AST], _, ResAST) -> + trans(AST, Header, ResAST); +trans([F | AST], LogHeader, ResAST) -> + trans(AST, LogHeader, [F | ResAST]). + +export_header_fun() -> + {attribute,erl_anno:new(0),export,[{'$logger_header',0}]}. + +header_fun(LogHeader) -> + L = erl_anno:new(0), + {function,L,'$logger_header',0, + [{clause,L, + [], [], [{string,L,pad(LogHeader)}]}]}. + +pad("") -> ""; +pad(Str) -> Str ++ " ".