Skip to content

Instantly share code, notes, and snippets.

@wdullaer
Created February 5, 2018 15:15
Show Gist options
  • Save wdullaer/086a173c549d7de1f7b9c5a72f3c9297 to your computer and use it in GitHub Desktop.
Save wdullaer/086a173c549d7de1f7b9c5a72f3c9297 to your computer and use it in GitHub Desktop.

Revisions

  1. wdullaer created this gist Feb 5, 2018.
    51 changes: 51 additions & 0 deletions bunyan-log.clj
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,51 @@
    (ns wdullaer.bunyan-log
    (:require [clojure.data.json :as json]
    [clojure.string :as string]
    [taoensso.timbre :as log]))

    (def bunyan-levels
    "Maps a logging level keyword into a bunyan integer level"
    {:trace 10
    :debug 20
    :info 30
    :warn 40
    :error 50
    :fatal 60})

    (defn bunyan-log-output
    "Function which formats a log command into a bunyan compatible json string",
    ([data] (bunyan-log-output nil data))
    ([opts data]
    (let [{:keys [no-stacktrace? stacktrace-fonts]} opts
    {:keys [name pid level ?err msg_ ?ns-str ?file hostname_ timestamp_ ?line]} data
    stack (when-not no-stacktrace? (when-let [err ?err] {:stack (log/stacktrace err opts)}))]
    (json/write-str (merge (:context data)
    {:v 0
    :name name
    :pid pid
    :hostname (force hostname_)
    :time (force timestamp_)
    :msg (force msg_)
    :level (level bunyan-levels)}
    (if (some? ?line) {:src {:file ?file :line ?line :namespace ?ns-str}} {})
    (if (some? stack) {:err stack} {}))))))

    (def currentPID
    "Get current process PID"
    (memoize
    (fn []
    (-> (java.lang.management.ManagementFactory/getRuntimeMXBean)
    (.getName)
    (string/split #"@")
    (first)))))

    (def iso-pattern "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")

    (defn bunyan-appender
    "Returns a Timbre appender which emits bunyan compatible json strings to stdout"
    [name]
    (assoc (taoensso.timbre.appenders.core/println-appender)
    :timestamp-opts {:pattern iso-pattern}
    :output-fn bunyan-log-output
    :name (str name)
    :pid (currentPID)))