sig
  type level = App | Error | Warning | Info | Debug
  val level : unit -> Logs.level option
  val set_level : ?all:bool -> Logs.level option -> unit
  val pp_level : Format.formatter -> Logs.level -> unit
  val level_to_string : Logs.level option -> string
  val level_of_string :
    string -> (Logs.level option, [ `Msg of string ]) Result.result
  type src
  val default : Logs.src
  module Src :
    sig
      type t = Logs.src
      val create : ?doc:string -> string -> Logs.src
      val name : Logs.src -> string
      val doc : Logs.src -> string
      val level : Logs.src -> Logs.level option
      val set_level : Logs.src -> Logs.level option -> unit
      val equal : Logs.src -> Logs.src -> bool
      val compare : Logs.src -> Logs.src -> int
      val pp : Format.formatter -> Logs.src -> unit
      val list : unit -> Logs.src list
    end
  module Tag :
    sig
      type 'a def
      type def_e = Def : 'Logs.Tag.def -> Logs.Tag.def_e
      val def :
        ?doc:string ->
        string -> (Format.formatter -> '-> unit) -> 'Logs.Tag.def
      val name : 'Logs.Tag.def -> string
      val doc : 'Logs.Tag.def -> string
      val printer : 'Logs.Tag.def -> Format.formatter -> '-> unit
      val pp_def : Format.formatter -> 'Logs.Tag.def -> unit
      val list : unit -> Logs.Tag.def_e list
      type t = V : 'Logs.Tag.def * '-> Logs.Tag.t
      val pp : Format.formatter -> Logs.Tag.t -> unit
      type set
      val empty : Logs.Tag.set
      val is_empty : Logs.Tag.set -> bool
      val mem : 'Logs.Tag.def -> Logs.Tag.set -> bool
      val add : 'Logs.Tag.def -> '-> Logs.Tag.set -> Logs.Tag.set
      val rem : 'Logs.Tag.def -> Logs.Tag.set -> Logs.Tag.set
      val find : 'Logs.Tag.def -> Logs.Tag.set -> 'a option
      val get : 'Logs.Tag.def -> Logs.Tag.set -> 'a
      val fold : (Logs.Tag.t -> '-> 'a) -> Logs.Tag.set -> '-> 'a
      val pp_set : Format.formatter -> Logs.Tag.set -> unit
    end
  type ('a, 'b) msgf =
      (?header:string ->
       ?tags:Logs.Tag.set ->
       ('a, Format.formatter, unit, 'b) Pervasives.format4 -> 'a) ->
      'b
  type 'a log = ('a, unit) Logs.msgf -> unit
  val msg : ?src:Logs.src -> Logs.level -> 'Logs.log
  val app : ?src:Logs.src -> 'Logs.log
  val err : ?src:Logs.src -> 'Logs.log
  val warn : ?src:Logs.src -> 'Logs.log
  val info : ?src:Logs.src -> 'Logs.log
  val debug : ?src:Logs.src -> 'Logs.log
  val kmsg :
    (unit -> 'b) -> ?src:Logs.src -> Logs.level -> ('a, 'b) Logs.msgf -> 'b
  val on_error :
    ?src:Logs.src ->
    ?level:Logs.level ->
    ?header:string ->
    ?tags:Logs.Tag.set ->
    pp:(Format.formatter -> '-> unit) ->
    use:('-> 'a) -> ('a, 'b) Result.result -> 'a
  val on_error_msg :
    ?src:Logs.src ->
    ?level:Logs.level ->
    ?header:string ->
    ?tags:Logs.Tag.set ->
    use:(unit -> 'a) -> ('a, [ `Msg of string ]) Result.result -> 'a
  module type LOG =
    sig
      val msg : Logs.level -> 'Logs.log
      val app : 'Logs.log
      val err : 'Logs.log
      val warn : 'Logs.log
      val info : 'Logs.log
      val debug : 'Logs.log
      val kmsg : (unit -> 'b) -> Logs.level -> ('a, 'b) Logs.msgf -> 'b
      val on_error :
        ?level:Logs.level ->
        ?header:string ->
        ?tags:Logs.Tag.set ->
        pp:(Format.formatter -> '-> unit) ->
        use:('-> 'a) -> ('a, 'b) Result.result -> 'a
      val on_error_msg :
        ?level:Logs.level ->
        ?header:string ->
        ?tags:Logs.Tag.set ->
        use:(unit -> 'a) -> ('a, [ `Msg of string ]) Result.result -> 'a
    end
  val src_log : Logs.src -> (module Logs.LOG)
  type reporter = {
    report :
      ''b.
        Logs.src ->
        Logs.level ->
        over:(unit -> unit) -> (unit -> 'b) -> ('a, 'b) Logs.msgf -> 'b;
  }
  val nop_reporter : Logs.reporter
  val format_reporter :
    ?pp_header:(Format.formatter -> Logs.level * string option -> unit) ->
    ?app:Format.formatter -> ?dst:Format.formatter -> unit -> Logs.reporter
  val reporter : unit -> Logs.reporter
  val set_reporter : Logs.reporter -> unit
  val report :
    Logs.src ->
    Logs.level ->
    over:(unit -> unit) -> (unit -> 'b) -> ('a, 'b) Logs.msgf -> 'b
  val incr_err_count : unit -> unit
  val incr_warn_count : unit -> unit
  val pp_print_text : Format.formatter -> string -> unit
  val pp_header : Format.formatter -> Logs.level * string option -> unit
  val err_count : unit -> int
  val warn_count : unit -> int
end