@@ -184,26 +184,33 @@ let read_env_config = State.read_env_config
184184
185185 param [structured_pairs] key/value pairs to use for structured log formats only. Plain logging will discard.
186186*)
187- type 'a pr = ?exn :exn -> ?lines:bool -> ?backtrace:bool -> ?saved_backtrace:string list -> ?ts:Time .t -> ?structured_pairs:Logger.Pairs .t -> ?pairs:Logger.Pairs .t -> ('a , unit , string , unit ) format4 -> 'a
187+ type 'a pr = ?rate_limit: Control.Rate_limit .t -> ? exn :exn -> ?lines:bool -> ?backtrace:bool -> ?saved_backtrace:string list -> ?ts:Time .t -> ?structured_pairs:Logger.Pairs .t -> ?pairs:Logger.Pairs .t -> ('a , unit , string , unit ) format4 -> 'a
188188
189- class logger facil =
190- let make_s (output_line :Logger.facil -> Time.t -> Logger.Pairs.t -> string -> unit ) =
189+ (* * Default rate limiter, shared between all the loggers *)
190+ let main_rate_limiter = Control.Rate_limit. create ~burst_factor: 10 ~allowed_per_sec: 1_000. ()
191+
192+ class logger ?(logger =State. logger) facil =
193+ let make_s (logger : Logger.t ) (level :Logger.level ) =
191194 let output = function
192195 | true ->
193196 fun facil ts pairs s ->
194197 if String. contains s '\n' then
195- List. iter (output_line facil ts pairs) @@ String. nsplit s " \n "
198+ List. iter (logger.put level facil ts pairs) @@ String. nsplit s " \n "
196199 else
197- output_line facil ts pairs s
198- | false -> output_line
200+ logger.put level facil ts pairs s
201+ | false -> logger.put level
199202 in
200203 let print_bt lines exn bt ts pairs s =
201204 output lines facil ts pairs (s ^ " : exn " ^ Exn. str exn ^ (if bt = [] then " (no backtrace)" else " " ));
202- List. iter (fun line -> output_line facil ts pairs (" " ^ line)) bt
205+ List. iter (fun line -> logger.put level facil ts pairs (" " ^ line)) bt
203206 in
204- fun ?exn ?(lines =true ) ?(backtrace =false ) ?saved_backtrace ?(ts =Unix. gettimeofday() ) ?(structured_pairs =[] ) ?(pairs =[] ) s ->
207+ fun ?(rate_limit =main_rate_limiter) ?exn ?(lines =true ) ?(backtrace =false ) ?saved_backtrace ?(ts =Unix. gettimeofday() ) ?(structured_pairs =[] ) ?(pairs =[] ) s ->
208+ if logger.allowed facil level && Control.Rate_limit. attempt rate_limit then
205209 let pairs = if State. is_structured_format () then List. rev_append structured_pairs pairs else pairs in
206210 try
211+ if Logger. allowed facil `Warn then (
212+ let rate_limited = Control.Rate_limit. take_rate_limited_count rate_limit in
213+ if rate_limited > 0 then logger.put `Warn facil ts [] (sprintf " (%d messages have been rate limited)" rate_limited));
207214 match exn with
208215 | None -> output lines facil ts pairs s
209216 | Some exn ->
@@ -214,17 +221,17 @@ class logger facil =
214221 | true -> print_bt lines exn (Exn. get_backtrace () ) ts pairs s
215222 | false -> output lines facil ts pairs (s ^ " : exn " ^ Exn. str exn )
216223 with exn ->
217- output_line facil ts pairs (sprintf " LOG FAILED : %S with message %S" (Exn. str exn ) s)
224+ logger.put level facil ts pairs (sprintf " LOG FAILED : %S with message %S" (Exn. str exn ) s)
218225in
219- let make : _ -> _ pr = fun output ?exn ?lines ?backtrace ?saved_backtrace ?ts ?structured_pairs ?pairs fmt ->
220- ksprintf (fun s -> output ?exn ?lines ?backtrace ?saved_backtrace ?ts ?structured_pairs ?pairs s) fmt
226+ let make : _ -> _ pr = fun output ?rate_limit ? exn ?lines ?backtrace ?saved_backtrace ?ts ?structured_pairs ?pairs fmt ->
227+ ksprintf (fun s -> output ?rate_limit ? exn ?lines ?backtrace ?saved_backtrace ?ts ?structured_pairs ?pairs s) fmt
221228in
222- let debug_s = make_s ( State. logger.put `Debug ) in
223- let warn_s = make_s ( State. logger.put `Warn ) in
224- let info_s = make_s ( State. logger.put `Info ) in
225- let error_s = make_s ( State. logger.put `Error ) in
226- let critical_s = make_s ( State. logger.put `Critical ) in
227- let put_s level = make_s ( State. logger.put level) in
229+ let debug_s = make_s logger `Debug in
230+ let warn_s = make_s logger `Warn in
231+ let info_s = make_s logger `Info in
232+ let error_s = make_s logger `Error in
233+ let critical_s = make_s logger `Critical in
234+ let put_s level = make_s logger level in
228235object
229236method debug_s = debug_s
230237method warn_s = warn_s
0 commit comments