Source file internal_event_unix.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
open Tezos_error_monad.TzLwtreslib
open Tezos_event_logging
open Error_monad
module Configuration = struct
include Tezos_base.Internal_event_config
let of_file path =
let open Lwt_result_syntax in
let* json = Lwt_utils_unix.Json.read_file path in
protect (fun () -> return (Data_encoding.Json.destruct encoding json))
end
let env_var_name = "TEZOS_EVENTS_CONFIG"
let init ?log_cfg ?(internal_events = Internal_event_config.lwt_log) () =
let _ =
[
File_descriptor_sink.Sink_implementation_path.uri_scheme;
File_event_sink.Sink_implementation.uri_scheme;
]
in
let open Lwt_result_syntax in
let*! r =
let* () = Lwt_result.ok @@ Lwt_log_sink_unix.initialize ?cfg:log_cfg () in
let* () =
match Sys.(getenv_opt env_var_name) with
| None -> return_unit
| Some s ->
let uris =
TzString.split_no_empty ' ' s
|> List.concat_map (TzString.split_no_empty '\n')
|> List.concat_map (TzString.split_no_empty '\t')
|> List.filter (( <> ) "")
|> List.map Uri.of_string
in
let* () =
List.iter_es
(fun uri ->
match Uri.scheme uri with
| None ->
let* cfg = Configuration.of_file (Uri.path uri) in
Internal_event_config.apply cfg
| Some _ -> Internal_event.All_sinks.activate uri)
uris
in
Internal_event.Debug_event.(
emit
(make
"Loaded URIs from environment"
~attach:
(`O
[("variable", `String env_var_name); ("value", `String s)])))
in
Configuration.apply internal_events
in
match r with
| Ok () -> Lwt.return_unit
| Error el ->
Format.kasprintf
Lwt.fail_with
"ERROR@ Initializing Internal_event_unix:@ %a\n%!"
Error_monad.pp_print_trace
el
let close () =
let open Lwt_syntax in
let* r = Internal_event.All_sinks.close () in
match r with
| Ok () -> Lwt.return_unit
| Error el ->
Format.kasprintf
Lwt.fail_with
"ERROR@ closing Internal_event_unix:@ %a\n%!"
Error_monad.pp_print_trace
el
open Filename.Infix
let make_default_internal_events daily_log_path =
let internal_logs =
Internal_event_config.make_config_uri
~daily_logs:7
~create_dirs:true
~level:Info
~format:"pp"
(`Path (daily_log_path // "daily.log"))
in
let user_logs = Uri.make ~scheme:Internal_event.Lwt_log_sink.uri_scheme () in
Internal_event_config.make_custom [user_logs; internal_logs]
let make_with_defaults ?internal_events ?enable_default_daily_logs_at () =
let internal_events =
match (internal_events, enable_default_daily_logs_at) with
| None, None -> Internal_event_config.lwt_log
| None, Some daily_logs_path -> make_default_internal_events daily_logs_path
| Some internal_events, _ -> internal_events
in
internal_events
let init_with_defaults ?internal_events ?enable_default_daily_logs_at ?log_cfg
() =
let internal_events =
make_with_defaults ?internal_events ?enable_default_daily_logs_at ()
in
init ?log_cfg ~internal_events ()