Skip to content

Commit

Permalink
systemd-style logger
Browse files Browse the repository at this point in the history
  • Loading branch information
c-cube committed Jan 24, 2024
1 parent 273ccdd commit 467e83b
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 22 deletions.
93 changes: 74 additions & 19 deletions src/opentheory/logger.ml
Original file line number Diff line number Diff line change
Expand Up @@ -16,38 +16,83 @@ let create () : t =

let log_to_chan self oc : unit = self.chans <- oc :: self.chans

let show_lvl = function
| Logs.Debug -> "<7>DEBUG"
| Logs.Info -> "<6>INFO"
| Logs.Error -> "<3>ERROR"
| Logs.Warning -> "<4>WARNING"
| Logs.App -> "<5>APP"

let pp_level_color out = function
| Logs.Debug -> Fmt.fprintf out "@{<bold>debug@}"
| Logs.Info -> Fmt.fprintf out "@{<Blue>INFO@}"
| Logs.App -> Fmt.fprintf out "APP"
| Logs.Error -> Fmt.fprintf out "@{<Red>ERROR@}"
| Logs.Warning -> Fmt.fprintf out "@{<Yellow>WARN@}"

let output_all (self : t) =
let s = Buffer.contents self.buf in
List.iter
(fun oc ->
output_string oc s;
flush oc)
self.chans

let as_reporter self : Logs.reporter =
let output_all () =
let s = Buffer.contents self.buf in
List.iter
(fun oc ->
output_string oc s;
flush oc)
self.chans
in
let pp_level_ out = function
| Logs.Debug -> Fmt.fprintf out "@{<bold>debug@}"
| Logs.Info -> Fmt.fprintf out "@{<Blue>INFO@}"
| Logs.App -> Fmt.fprintf out "APP"
| Logs.Error -> Fmt.fprintf out "@{<Red>ERROR@}"
| Logs.Warning -> Fmt.fprintf out "@{<Yellow>WARN@}"
in
{
Logs.report =
(fun src lvl ~over k msg ->
if self.chans <> [] then (
Mutex.lock self.lock;
CCFun.protect ~finally:(fun () -> Mutex.unlock self.lock) @@ fun () ->
Buffer.clear self.buf;
Fmt.fprintf self.fmt "(@[%a[%s" pp_level_ lvl (Logs.Src.name src);
Fmt.fprintf self.fmt "(@[%a[%s" pp_level_color lvl (Logs.Src.name src);
msg (fun ?header ?(tags = Logs.Tag.empty) fmt ->
Option.iter (fun s -> Fmt.fprintf self.fmt ",%s" s) header;
if not (Logs.Tag.is_empty tags) then Logs.Tag.pp_set self.fmt tags;
Fmt.fprintf self.fmt "]@ ";
Fmt.kfprintf
(fun _ ->
Fmt.fprintf self.fmt "@])@.";
output_all ();
output_all self;
(* output content of [self.buf] *)
over ();
k ())
self.fmt fmt)
) else
k ());
}

let as_basic_reporter (self : t) : Logs.reporter =
{
Logs.report =
(fun src lvl ~over k msg ->
let pp_header out (lvl, src) : unit =
let src =
match src with
| None -> ""
| Some s -> Printf.sprintf "[%s]" s
in
Fmt.fprintf out "%s%s: " (show_lvl lvl) src
in

if self.chans <> [] then (
Mutex.lock self.lock;
CCFun.protect ~finally:(fun () -> Mutex.unlock self.lock) @@ fun () ->
Buffer.clear self.buf;
let src = Logs.Src.name src in
let src =
if src = "" then
None
else
Some src
in
pp_header self.fmt (lvl, src);
msg (fun ?header:_ ?tags:_ fmt ->
Fmt.kfprintf
(fun _ ->
Fmt.fprintf self.fmt "@.";
output_all self;
(* output content of [self.buf] *)
over ();
k ())
Expand All @@ -74,11 +119,21 @@ let setup_trustee_ =

let setup_trustee () = Lazy.force setup_trustee_

let setup_logs ?(files = []) ~debug ~level () =
let setup_logs ?(files = []) ~(style : [ `COLOR | `SYSTEMD ]) ~debug ~level () =
setup_trustee ();
let l = create () in
log_to_chan l stdout;
Logs.set_reporter (as_reporter l);
let rep =
match style with
| `COLOR -> as_reporter l
| `SYSTEMD ->
Logs.set_reporter_mutex
~lock:(fun () -> Mutex.lock l.lock)
~unlock:(fun () -> Mutex.unlock l.lock);
as_basic_reporter l
in

Logs.set_reporter rep;
Logs.set_level ~all:true
(Some
(if debug then
Expand Down
8 changes: 7 additions & 1 deletion src/opentheory/logger.mli
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,13 @@ val as_reporter : t -> Logs.reporter

val log_to_chan : t -> out_channel -> unit

val setup_logs : ?files:string list -> debug:bool -> level:int -> unit -> unit
val setup_logs :
?files:string list ->
style:[ `COLOR | `SYSTEMD ] ->
debug:bool ->
level:int ->
unit ->
unit
(** Setup reporter and debug level for {!Logs} *)

val setup_trustee : unit -> unit
Expand Down
3 changes: 1 addition & 2 deletions src/opentheory/tool/trustee_ot.ml
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,8 @@ let () =
let serve = ref false in
let port = ref 8089 in
let set_debug n =
if n > 1 then H._enable_debug true;
Log.set_level n;
Logger.setup_logs ~debug:(n > 1) ~level:n ()
Logger.setup_logs ~debug:(n > 1) ~style:`SYSTEMD ~level:n ()
in
let opts =
[
Expand Down

0 comments on commit 467e83b

Please sign in to comment.