module Logs_lwt:sig
..end
Lwt
logging.
The log functions of this module return Lwt
threads that proceed
only when the log operation is over, as defined by the current
Logs.reporter
.
See a cooperative reporter example.
Release 0.5.0 - Daniel Bünzli <daniel.buenzl i@erratique.ch>
type'a
log =('a, unit Lwt.t) Logs.msgf -> unit Lwt.t
Logs.log
.val msg : ?src:Logs.src -> Logs.level -> 'a log
Logs.msg
.val app : ?src:Logs.src -> 'a log
Logs.app
.val err : ?src:Logs.src -> 'a log
Logs.err
.val warn : ?src:Logs.src -> 'a log
Logs.warn
.val info : ?src:Logs.src -> 'a log
Logs.info
.val debug : ?src:Logs.src -> 'a log
Logs.debug
.val kmsg : (unit -> 'b Lwt.t) ->
?src:Logs.src -> Logs.level -> ('a, 'b Lwt.t) Logs.msgf -> 'b Lwt.t
Logs.kmsg
.result
value Error
sval on_error : ?src:Logs.src ->
?level:Logs.level ->
?header:string ->
?tags:Logs.Tag.set ->
pp:(Format.formatter -> 'b -> unit) ->
use:('b -> 'a Lwt.t) -> ('a, 'b) Result.result Lwt.t -> 'a Lwt.t
Logs.on_error
.val on_error_msg : ?src:Logs.src ->
?level:Logs.level ->
?header:string ->
?tags:Logs.Tag.set ->
use:(unit -> 'a Lwt.t) ->
('a, [ `Msg of string ]) Result.result Lwt.t -> 'a Lwt.t
Logs.on_error_msg
.module type LOG =sig
..end
val src_log : Logs.src -> (module Logs_lwt.LOG)
The following reporter will play nice with Lwt
's runtime, it
will behave synchronously for the log functions of this module and
asynchronously for those of the Logs
module (see Note on synchronous logging).
It reuses Logs_fmt.reporter
and will produce colorful output if
the standard formatters are setup to do so. For example it can be
used instead of Logs_fmt.reporter
in the full
setup example.
let lwt_reporter () =
let buf_fmt ~like =
let b = Buffer.create 512 in
Fmt.with_buffer ~like b,
fun () -> let m = Buffer.contents b in Buffer.reset b; m
in
let app, app_flush = buf_fmt ~like:Fmt.stdout in
let dst, dst_flush = buf_fmt ~like:Fmt.stderr in
let reporter = Logs_fmt.reporter ~app ~dst () in
let report src level ~over k msgf =
let k () =
let write () = match level with
| Logs.App -> Lwt_io.write Lwt_io.stdout (app_flush ())
| _ -> Lwt_io.write Lwt_io.stderr (dst_flush ())
in
let unblock () = over (); Lwt.return_unit in
Lwt.finalize write unblock |> Lwt.ignore_result;
k ()
in
reporter.Logs.report src level ~over:(fun () -> ()) k msgf;
in
{ Logs.report = report }