Skip to content

Instantly share code, notes, and snippets.

@frankiesardo
Last active November 11, 2016 19:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save frankiesardo/35db60c2fa04e0ecadb33439ee9e5c84 to your computer and use it in GitHub Desktop.
Save frankiesardo/35db60c2fa04e0ecadb33439ee9e5c84 to your computer and use it in GitHub Desktop.
(ns example.log)
(defprotocol Logger
(log [this msg]))
(defn map* [f logger]
(reify Logger
(log [this msg] (log logger (f msg)))))
;; Convenience fns. You probably want trace, debug and failure as well. And add :timestamp, :host etc.
(defn info [logger service desc]
(log logger {:service service :level :info :description desc}))
(defn warn [logger service desc]
(log logger {:service service :level :warn :description desc}))
(defn error [logger service desc]
(log logger {:service service :level :error :description desc}))
;; Examples
(defn update-profile [logger user]
(if (some? user)
(info logger ::profile.update user)
(warn logger ::profile.update {:reason "Not found"})))
(defn handle-user-request [logger user-id]
(let [logger* (map* #(assoc % :user-id user-id) logger)
user (comment (get-user-from-db))]
(update-profile logger* user)))
;; Some loggers. Comment them if you don't have the appropriate dependencies
(defrecord StdoutLogger [] Logger
(log [this msg] (println msg)))
(require '[clj-http.client :as http]
'[cheshire.core :as json])
(defrecord ElasticSearchLogger [] Logger
(log [this msg] (http/post "elastic.domain" (json/encode msg))))
(require '[clojure.core.async :as async])
(defrecord AsyncLogger [channel] Logger
(log [this msg] (async/go (async/>! channel msg))))
(defn try-async []
(let [{:keys [channel] :as logger} (AsyncLogger. (async/chan))]
(info logger ::some.data "Hello async")
(async/go (println (async/<! channel)))
42))
;; Test logs
(require '[clojure.test :refer :all])
(defrecord TestLogger [logs] Logger
(log [this msg] (swap! logs conj msg)))
(deftest logs-correct-data
(let [{:keys [logs] :as logger} (TestLogger. (atom []))]
(handle-user-request logger 123)
(is (= [[::profile.update 123]] (map (juxt :service :user-id) @logs)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment