package simlog

  1. Overview
  2. Docs

Source file recorder.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
66
67
68
69
70
71
module Level = struct
  type t =
    | Info
    | Warn
    | Error
    | Debug

  let to_string = function
    | Info -> "Info"
    | Warn -> "Warn"
    | Error -> "Error"
    | Debug -> "Debug"
end

(** The logger gets the time, Queue traces, level, thread information, and so on *)

module Trace = struct
  type t = string

  let get () : t = Printexc.get_backtrace ()
end

type record = {
  time : float option;
  trace : Trace.t option;
  thread : Thread.t option;
  level : Level.t;
  log_message : string;
}

and t = record

type opt = {
  time : bool;
  trace : bool;
  thread : bool;
}
(** Some log information is optional, 
    you can configure whether to record the corresponding information through this module *)

module type T = sig
  val opt : opt
end

let[@inline] record ~(opt : opt) ~(level : Level.t) (log_message : string) : t =
  let {time; trace; thread} = opt in
    {
      time =
        (if time then
           Some (Unix.gettimeofday ())
         else
           None);
      trace =
        (if trace then
           Some (Trace.get ())
         else
           None);
      thread =
        (if thread then
           Some (Thread.self ())
         else
           None);
      level;
      log_message;
    }

module Builtin = struct
  module Recorder : T = struct
    let opt = {time = true; trace = false; thread = true}
  end
end