2015-11-23 15:43:26 +00:00
|
|
|
(ns app.utils.logging
|
|
|
|
|
(:require [robert.hooke :refer [add-hook clear-hooks]]
|
|
|
|
|
[clojure.string :refer [split]]
|
|
|
|
|
[clojure.tools.logging :refer [info]]))
|
|
|
|
|
|
|
|
|
|
(alter-meta! *ns* assoc ::load false)
|
|
|
|
|
|
|
|
|
|
(defn- f-to-action [f]
|
|
|
|
|
(let [fname (-> (str f)
|
|
|
|
|
(split #"@")
|
|
|
|
|
first)]
|
|
|
|
|
(case fname
|
|
|
|
|
"mount.core$up" :up
|
|
|
|
|
"mount.core$down" :down
|
|
|
|
|
"mount.core$sigstop" :suspend
|
|
|
|
|
"mount.core$sigcont" :resume
|
|
|
|
|
:noop)))
|
|
|
|
|
|
|
|
|
|
(defn whatcha-doing? [{:keys [started? suspended? suspend]} action]
|
|
|
|
|
(case action
|
2015-11-23 15:51:27 +00:00
|
|
|
:up (if suspended? ">> resuming"
|
|
|
|
|
(if-not started? ">> starting"))
|
|
|
|
|
:down (if (or started? suspended?) "<< stopping")
|
|
|
|
|
:suspend (if (and started? suspend) "<< suspending")
|
|
|
|
|
:resume (if suspended? ">> resuming")))
|
2015-11-23 15:43:26 +00:00
|
|
|
|
|
|
|
|
(defn log-status [f & args]
|
|
|
|
|
(let [{:keys [ns name] :as state} (second args)
|
|
|
|
|
action (f-to-action f)]
|
|
|
|
|
(when-let [taking-over-the-world (whatcha-doing? state action)]
|
2015-11-23 15:51:27 +00:00
|
|
|
(info (str taking-over-the-world ".. " (ns-resolve ns name))))
|
2015-11-23 15:43:26 +00:00
|
|
|
(apply f args)))
|
|
|
|
|
|
|
|
|
|
(defonce lifecycle-fns
|
|
|
|
|
#{#'mount.core/up
|
|
|
|
|
#'mount.core/down
|
|
|
|
|
#'mount.core/sigstop
|
|
|
|
|
#'mount.core/sigcont})
|
|
|
|
|
|
|
|
|
|
(defn with-logging-status []
|
|
|
|
|
(doall (map #(add-hook % log-status) lifecycle-fns)))
|
|
|
|
|
|
|
|
|
|
(defn without-logging-status []
|
|
|
|
|
(doall (map #(clear-hooks %) lifecycle-fns)))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;; here is just to illustrate lificycle of states in REPL
|
|
|
|
|
;; if needed in reality will be called in "-main" or another entry point
|
|
|
|
|
|
|
|
|
|
(without-logging-status)
|
|
|
|
|
(with-logging-status)
|