Source file logger.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
open Stdio.Out_channel

type level = TRACE | DEBUG | INFO | WARN | ERROR

type t = {
  node_id : int;
  mode : Base.mode option;
  output_path : string;
  level : level;
}

let int_of_level = function
  | TRACE -> 0
  | DEBUG -> 1
  | INFO -> 2
  | WARN -> 3
  | ERROR -> 4


let string_of_level = function
  | TRACE -> "TRACE"
  | DEBUG -> "DEBUG"
  | INFO -> "INFO"
  | WARN -> "WARN"
  | ERROR -> "ERROR"


let level_of_string s =
  match s with
  | "TRACE" -> TRACE
  | "DEBUG" -> DEBUG
  | "INFO" -> INFO
  | "WARN" -> WARN
  | "ERROR" -> ERROR
  | _ -> failwith (Printf.sprintf "Unexpected value: %s" s)


let create ~node_id ~mode ~output_path ~level =
  { node_id; mode; output_path; level = level_of_string level }


let write t ~level ~msg =
  let mode =
    match t.mode with Some x -> Base.show_mode x | None -> "--------"
  in
  if int_of_level level >= int_of_level t.level
  then
    with_file t.output_path
      ~f:(fun file ->
        let now = Core.Time.to_string (Core.Time.now ()) in
        let s =
          Printf.sprintf "%s %s [%d:%s] - %s\n" now (string_of_level level)
            t.node_id mode msg
        in
        ignore (output_string file s))
      ~append:true


let debug t msg = write t ~level:DEBUG ~msg

let info t msg = write t ~level:INFO ~msg

let warn t msg = write t ~level:WARN ~msg

let error t msg = write t ~level:ERROR ~msg