From 9cc4abc36661afcccf91ce86de39aad30bd2fc3a Mon Sep 17 00:00:00 2001 From: "John R. Daily" Date: Tue, 23 Jun 2015 16:10:03 -0400 Subject: [PATCH] Support _unsafe message levels that dodge trunc_io --- include/lager.hrl | 25 +++++++++++++++---------- src/lager_transform.erl | 19 +++++++++++++++++-- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/include/lager.hrl b/include/lager.hrl index 124e17d..f9ddf99 100644 --- a/include/lager.hrl +++ b/include/lager.hrl @@ -22,6 +22,11 @@ -define(LEVELS, [debug, info, notice, warning, error, critical, alert, emergency, none]). +%% Use of these "functions" means that the argument list will not be +%% truncated for safety +-define(LEVELS_UNSAFE, + [debug_unsafe, info_unsafe, notice_unsafe, warning_unsafe, error_unsafe, critical_unsafe, alert_unsafe, emergency_unsafe]). + -define(DEBUG, 128). -define(INFO, 64). -define(NOTICE, 32). @@ -64,7 +69,7 @@ Level, [{pid,Pid},{line,?LINE},{file,?FILE},{module,?MODULE}], [])} - )). + )). %% FOR INTERNAL USE ONLY %% internal non-blocking logging call @@ -102,14 +107,14 @@ -endif. -record(lager_shaper, { - %% how many messages per second we try to deliver - hwm = undefined :: 'undefined' | pos_integer(), - %% how many messages we've received this second - mps = 0 :: non_neg_integer(), - %% the current second - lasttime = os:timestamp() :: erlang:timestamp(), - %% count of dropped messages this second - dropped = 0 :: non_neg_integer() - }). + %% how many messages per second we try to deliver + hwm = undefined :: 'undefined' | pos_integer(), + %% how many messages we've received this second + mps = 0 :: non_neg_integer(), + %% the current second + lasttime = os:timestamp() :: erlang:timestamp(), + %% count of dropped messages this second + dropped = 0 :: non_neg_integer() + }). -type lager_shaper() :: #lager_shaper{}. diff --git a/src/lager_transform.erl b/src/lager_transform.erl index eda84d1..1a1a681 100644 --- a/src/lager_transform.erl +++ b/src/lager_transform.erl @@ -89,7 +89,13 @@ transform_statement({call, Line, {remote, _Line1, {atom, _Line2, Module}, SinkName = list_to_atom(atom_to_list(Module) ++ "_event"), do_transform(Line, SinkName, Function, Arguments0); false -> - Stmt + case lists:member(Function, ?LEVELS_UNSAFE) of + true -> + SinkName = list_to_atom(atom_to_list(Module) ++ "_event"), + do_transform(Line, SinkName, Function, Arguments0, unsafe); + false -> + Stmt + end end; false -> list_to_tuple(transform_statement(tuple_to_list(Stmt), Sinks)) @@ -102,6 +108,9 @@ transform_statement(Stmt, _Sinks) -> Stmt. do_transform(Line, SinkName, Severity, Arguments0) -> + do_transform(Line, SinkName, Severity, Arguments0, safe). + +do_transform(Line, SinkName, Severity, Arguments0, Safety) -> SeverityAsInt=lager_util:level_to_num(Severity), DefaultAttrs0 = {cons, Line, {tuple, Line, [ {atom, Line, module}, {atom, Line, get(module)}]}, @@ -168,6 +177,12 @@ do_transform(Line, SinkName, Severity, Arguments0) -> LevelVar = make_varname("__Level", Line), TracesVar = make_varname("__Traces", Line), PidVar = make_varname("__Pid", Line), + LogFun = case Safety of + safe -> + do_log; + unsafe -> + do_log_unsafe + end, %% Wrap the call to lager:dispatch_log/6 in case that will avoid doing any work if this message is not elegible for logging %% See lager.erl (lines 89-100) for lager:dispatch_log/6 %% case {whereis(Sink), whereis(?DEFAULT_SINK), lager_config:get({Sink, loglevel}, {?LOG_NONE, []})} of @@ -205,7 +220,7 @@ do_transform(Line, SinkName, Severity, Arguments0) -> [[{op, Line, 'orelse', {op, Line, '/=', {op, Line, 'band', {var, Line, LevelVar}, {integer, Line, SeverityAsInt}}, {integer, Line, 0}}, {op, Line, '/=', {var, Line, TracesVar}, {nil, Line}}}]], - [{call,Line,{remote, Line, {atom, Line, lager}, {atom, Line, do_log}}, + [{call,Line,{remote, Line, {atom, Line, lager}, {atom, Line, LogFun}}, [{atom,Line,Severity}, Meta, Message,