diff --git a/dune-project b/dune-project index 8b145a9..17d2322 100644 --- a/dune-project +++ b/dune-project @@ -22,6 +22,7 @@ (depends (ocaml (>= 4.14)) (dune (>= 3.23)) + yojson (alcotest :with-test)) (tags ("logging" "structured-logging" "json" "library"))) diff --git a/lib/sinks/dune b/lib/sinks/dune index 9f2fff6..e8c28b1 100644 --- a/lib/sinks/dune +++ b/lib/sinks/dune @@ -1,4 +1,4 @@ (library (name scribe_sinks) (public_name scribe.sinks) - (libraries scribe)) + (libraries scribe yojson)) diff --git a/lib/sinks/json.ml b/lib/sinks/json.ml index ed45c08..9c58064 100644 --- a/lib/sinks/json.ml +++ b/lib/sinks/json.ml @@ -1,51 +1,20 @@ -let add_json_string buffer value = - Buffer.add_char buffer '"'; - String.iter - (fun char -> - match char with - | '"' -> Buffer.add_string buffer "\\\"" - | '\\' -> Buffer.add_string buffer "\\\\" - | '\b' -> Buffer.add_string buffer "\\b" - | '\012' -> Buffer.add_string buffer "\\f" - | '\n' -> Buffer.add_string buffer "\\n" - | '\r' -> Buffer.add_string buffer "\\r" - | '\t' -> Buffer.add_string buffer "\\t" - | char when Char.code char < 0x20 -> - Buffer.add_string buffer (Printf.sprintf "\\u%04x" (Char.code char)) - | char -> Buffer.add_char buffer char) - value; - Buffer.add_char buffer '"' +let json_of_value = function + | Scribe.Field.String value -> `String value + | Scribe.Field.Int value -> `Int value + | Scribe.Field.Bool value -> `Bool value ;; -let add_value buffer = function - | Scribe.Field.String value -> add_json_string buffer value - | Scribe.Field.Int value -> Buffer.add_string buffer (string_of_int value) - | Scribe.Field.Bool value -> Buffer.add_string buffer (string_of_bool value) -;; +let json_of_field field = Scribe.Field.key field, json_of_value (Scribe.Field.value field) -let add_fields buffer fields = - Buffer.add_char buffer '{'; - List.iteri - (fun index field -> - if index > 0 then Buffer.add_char buffer ','; - add_json_string buffer (Scribe.Field.key field); - Buffer.add_char buffer ':'; - add_value buffer (Scribe.Field.value field)) - fields; - Buffer.add_char buffer '}' +let json_of_event event = + `Assoc + [ "level", `String (Scribe.Level.to_string (Scribe.Event.level event)) + ; "message", `String (Scribe.Event.message event) + ; "fields", `Assoc (List.map json_of_field (Scribe.Event.fields event)) + ] ;; -let string_of_event event = - let buffer = Buffer.create 128 in - Buffer.add_string buffer "{\"level\":"; - add_json_string buffer (Scribe.Level.to_string (Scribe.Event.level event)); - Buffer.add_string buffer ",\"message\":"; - add_json_string buffer (Scribe.Event.message event); - Buffer.add_string buffer ",\"fields\":"; - add_fields buffer (Scribe.Event.fields event); - Buffer.add_char buffer '}'; - Buffer.contents buffer -;; +let string_of_event event = Yojson.Safe.to_string (json_of_event event) let channel output = Scribe.Sink.make (fun event -> diff --git a/scribe.opam b/scribe.opam index 088803a..4c22dbb 100644 --- a/scribe.opam +++ b/scribe.opam @@ -13,6 +13,7 @@ bug-reports: "https://github.com/sambyeol/scribe/issues" depends: [ "ocaml" {>= "4.14"} "dune" {>= "3.23"} + "yojson" "alcotest" {with-test} "odoc" {with-doc} ]