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