Last active
November 11, 2016 19:56
-
-
Save frankiesardo/35db60c2fa04e0ecadb33439ee9e5c84 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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