Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions dune-project
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
(depends
(ocaml (>= 4.14))
(dune (>= 3.23))
yojson
(alcotest :with-test))
(tags
("logging" "structured-logging" "json" "library")))
2 changes: 1 addition & 1 deletion lib/sinks/dune
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
(library
(name scribe_sinks)
(public_name scribe.sinks)
(libraries scribe))
(libraries scribe yojson))
55 changes: 12 additions & 43 deletions lib/sinks/json.ml
Original file line number Diff line number Diff line change
@@ -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 ->
Expand Down
1 change: 1 addition & 0 deletions scribe.opam
Original file line number Diff line number Diff line change
Expand Up @@ -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}
]
Expand Down