Module Logs_lwt

Contents

Instructions: Use this module in your project

In the IDE (CLion, Visual Studio Code, Xcode, etc.) you use for your DkSDK project:

  1. Add the following to your project's dependencies/CMakeLists.txt:

    Copy
    DkSDKProject_DeclareAvailable(logs
        CONSTRAINT "= 0.7.0+dune2"
        FINDLIBS logs logs.cli logs.fmt logs.lwt logs.threaded logs.top)
    DkSDKProject_MakeAvailable(logs)
  2. Add the Findlib::logs library to any desired targets in src/*/CMakeLists.txt:

    Copy
    target_link_libraries(YourPackage_YourLibraryName
         # ... existing libraries, if any ...
         Findlib::logs)
  3. Click your IDE's Build button

Not using DkSDK?

FIRST, do one or all of the following:

  1. Run:

    Copy
    opam install logs.0.7.0+dune2
  2. Edit your dune-project and add:

    Copy
    (package
      (name YourExistingPackage)
      (depends
      ; ... existing dependenices ...
      (logs (>= 0.7.0+dune2))))

    Then run:

    Copy
    dune build *.opam # if this fails, run: dune build
  3. Edit your <package>.opam file and add:

    Copy
    depends: [
      # ... existing dependencies ...
      "logs" {>= "0.7.0+dune2"}
    ]

    Then run:

    Copy
    opam install . --deps-only

FINALLY, add the logs.lwt library to any desired (library)and/or (executable) targets in your **/dune files:

Copy
(library
  (name YourLibrary)
  ; ... existing library options ...
  (libraries
    ; ... existing libraries ...
    logs.lwt))

(executable
  (name YourExecutable)
  ; ... existing executable options ...
  (libraries
    ; ... existing libraries ...
    logs.lwt))

Log functions

type ``'a log`` = ``('a, ``unit Lwt.t)`` Logs.msgf ->``unitLwt.t

The type for Lwt log functions. The returned thread only proceeds once the log operation is over. See Logs.log.

val msg : ``?src:Logs.src -> Logs.level -> 'a log

See Logs.msg.

val app : ``?src:Logs.src -> 'a log

See Logs.app.

val err : ``?src:Logs.src -> 'a log

See Logs.err.

val warn : ``?src:Logs.src -> 'a log

See Logs.warn.

val info : ``?src:Logs.src -> 'a log

See Logs.info.

val debug : ``?src:Logs.src -> 'a log

See Logs.debug.

valkmsg : ``(``unit-> 'b Lwt.t)`` -> ``?src:Logs.src -> Logs.level -> ``('a, 'b Lwt.t)`` Logs.msgf -> 'b Lwt.t

See Logs.kmsg.

Logging value Errors

val on_error : ``?src:Logs.src -> ``?level:Logs.level ->``?header:string-> ``?tags:Logs.Tag.set -> ``pp:``(Stdlib.Format.formatter -> 'b ->unit)``-> ``use:``('b -> 'a Lwt.t)`` -> ``('a, 'b)`` result Lwt.t -> 'a Lwt.t
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](../../ocaml/Stdlib/#type-result) [Lwt.t](../../lwt/Lwt/#type-t) `-> 'a [Lwt.t\](../lwt/Lwt.html#type-t)

Source specific log functions

module type LOG=sig...end
valsrc_log :Logs.src -> ``(module LOG)

src_log src is a set of logging functions for src.

Cooperative reporter example

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 sync).

It reuses reporter and will produce colorful output if the standard formatters are setup to do so. For example it can be used instead of reporter in the full setup example.

Copy
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 }