type level =
  | TRACE (* 0 *)
  | DEBUG (* 1 *)
  | INFO  (* 2 *)
  | WARN  (* 3 *)
  | ERROR (* 4 *)

external int_of_level : level -> int = "%identity"

type writer =
  ts:Time.t ->
  ns:string ->
  filename:string ->
  lineno:int ->
  func:string ->
  errno:int ->
  exn:((exn * Printexc.raw_backtrace) option) ->
  lvl:level ->
  string ->
  unit

let ( +++ ) w1 w2 ~ts ~ns ~filename ~lineno ~func ~errno ~exn ~lvl msg =
  w1 ~ts ~ns ~filename ~lineno ~func ~errno ~exn ~lvl msg;
  w2 ~ts ~ns ~filename ~lineno ~func ~errno ~exn ~lvl msg