Logging in OCaml

Here’s the translation of the Go logging example to OCaml, with explanations in Markdown format suitable for Hugo:

(* The OCaml standard library provides basic logging functionality
   through the Printf module. For more advanced logging, we'll use
   the Logs library, which offers structured logging capabilities. *)

open Printf
module L = Logs

(* Set up the Logs library *)
let () =
  L.set_reporter (L.format_reporter ());
  L.set_level (Some L.Info)

let main () =
  (* Simple logging using Printf *)
  printf "standard logger\n";

  (* Logs library offers different log levels *)
  L.info (fun m -> m "info level log");
  L.debug (fun m -> m "debug level log");

  (* Logs with additional context *)
  L.info (fun m -> m "log with context %s" "some context");

  (* Logs with key-value pairs *)
  L.info (fun m -> m "log with key-value pairs %a" 
    Logs.pp_kv [("key", "value"); ("number", string_of_int 42)]);

  (* Logging to a specific output *)
  let buffer = Buffer.create 100 in
  let formatter = Format.formatter_of_buffer buffer in
  L.info ~dst:formatter (fun m -> m "log to buffer");
  printf "From buffer: %s\n" (Buffer.contents buffer);

  (* Using tags for structured logging *)
  let src = Logs.Src.create "myapp" in
  let myapp_logger = (src, L.Info) in
  L.info ~src (fun m -> m "log from myapp");

  (* Logs with different log levels *)
  L.app (fun m -> m "application level log");
  L.warn (fun m -> m "warning level log");
  L.err (fun m -> m "error level log")

let () = main ()

This OCaml code demonstrates various logging techniques using both the standard library’s Printf module and the Logs library, which provides more advanced logging capabilities.

To run the program, save it as logging.ml and use ocamlc or ocamlopt to compile:

$ ocamlfind ocamlc -package logs -linkpkg logging.ml -o logging
$ ./logging
standard logger
info level log
log with context some context
log with key-value pairs key=value number=42
From buffer: log to buffer
log from myapp
application level log
warning level log
error level log

Note that the exact output format may vary depending on the Logs library configuration. The debug level log might not appear in the output if the log level is set to Info or higher.

In this example, we’ve covered:

  1. Basic logging using Printf
  2. Structured logging with the Logs library
  3. Different log levels (info, debug, warn, error)
  4. Adding context and key-value pairs to logs
  5. Logging to a specific output (buffer in this case)
  6. Creating custom log sources

The Logs library in OCaml provides a flexible and powerful logging system, allowing for structured logging similar to the slog package in the original example. While the syntax and exact features differ, the core concepts of logging levels, structured data, and custom outputs are preserved.

Remember to install the logs package using OPAM (opam install logs) before compiling the program.