Source file log.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
(******************************************************************************)
(*               Erssical                                                     *)
(*                                                                            *)
(*   Copyright (C) 2013 Institut National de Recherche en Informatique        *)
(*   et en Automatique. All rights reserved.                                  *)
(*                                                                            *)
(*   This program is free software; you can redistribute it and/or modify     *)
(*   it under the terms of the GNU Lesser General Public License version      *)
(*   3 as published by the Free Software Foundation.                          *)
(*                                                                            *)
(*   This program is distributed in the hope that it will be useful,          *)
(*   but WITHOUT ANY WARRANTY; without even the implied warranty of           *)
(*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *)
(*   GNU Library General Public License for more details.                     *)
(*                                                                            *)
(*   You should have received a copy of the GNU Library General Public        *)
(*   License along with this program; if not, write to the Free Software      *)
(*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA                 *)
(*   02111-1307  USA                                                          *)
(*                                                                            *)
(*   Contact: Maxence.Guesdon@inria.fr                                        *)
(*                                                                            *)
(*                                                                            *)
(******************************************************************************)

(** *)

open Lwt.Infix

type t = { file : string ; oc : Lwt_io.output_channel }

let stdout () = { file = "" ; oc = Lwt_io.stdout }

let of_file file =
  let%lwt oc = Lwt_io.open_file
    ~flags:[ Unix.O_APPEND ; Unix.O_CREAT ; Unix.O_WRONLY ]
      ~perm: 0o600
      ~mode:Lwt_io.Output file
  in
  Lwt.return { file ; oc }
;;

let date () =
  let d = Unix.gettimeofday () in
  match Ptime.of_float_s d with
  | Some t -> Ptime.to_rfc3339 t
  | None -> string_of_float d
;;

let print log s =
  try%lwt
    Lwt_io.write_line log.oc (Printf.sprintf "[%s] %s" (date ()) s)
  with e ->
    prerr_endline (Printexc.to_string e);
    Lwt.fail_with (Printexc.to_string e)
;;

let close log = Lwt_io.close log.oc;;