Skip to content

Commit

Permalink
tests for collect-vargs-fn
Browse files Browse the repository at this point in the history
  • Loading branch information
Michieljoris committed Nov 24, 2023
1 parent 9bf1c66 commit 4e280db
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 21 deletions.
36 changes: 18 additions & 18 deletions src/timbre_json_appender/core.clj
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
placeholders)]
(recur placeholders (inc idx)))))))

(defn default-collect-vargs [vargs]
(defn default-collect-vargs-fn [vargs]
(cond
;; if only two vargs are provided with types [string, map], take the map as args
(and (= 2 (count vargs))
Expand All @@ -62,18 +62,18 @@
(defn handle-vargs
"Handles varg parsing, adding the msg and the given context to the given log map.
collect-vargs is a function that takes the vargs and should retun a map with :message and :args keys.
collect-vargs-fn is a function that takes the vargs and should retun a map with :message and :args keys.
If inline-args? is true args extracted by collect-vargs are inlined into the
If inline-args? is true args extracted by collect-vargs-fn are inlined into the
log-map, otherwise they are added to :args."
[{:keys [log-map ?msg-fmt vargs inline-args? msg-key collect-vargs]
:or {msg-key :msg}}]
[{:keys [log-map ?msg-fmt vargs inline-args? msg-key collect-vargs-fn]
:or {msg-key (:msg default-key-names)}}]
(let [interpolate (fn [vargs] (let [format-specifiers (count-format-specifiers ?msg-fmt)
[message vargs] (split-at format-specifiers vargs)
interpolated-message (String/format ?msg-fmt (to-array message))]
(into [interpolated-message] vargs)))
{:keys [message args]} (collect-vargs (cond-> vargs
?msg-fmt interpolate))
{:keys [message args]} (collect-vargs-fn (cond-> vargs
?msg-fmt interpolate))
log-map (cond-> log-map
message (assoc msg-key message))]
(merge-log-map inline-args? log-map args)))
Expand Down Expand Up @@ -132,13 +132,13 @@
`key-names`: Map of log key names. Can be used to override the default key names in `default-key-names`"
([]
(make-json-output-fn {}))
([{:keys [pretty inline-args? level-key msg-key should-log-field-fn ex-data-field-fn key-names collect-vargs]
([{:keys [pretty inline-args? level-key msg-key should-log-field-fn ex-data-field-fn key-names collect-vargs-fn]
:or {pretty false
inline-args? true
should-log-field-fn default-should-log-field-fn
ex-data-field-fn default-ex-data-field-fn
key-names default-key-names
collect-vargs default-collect-vargs}}]
collect-vargs-fn default-collect-vargs-fn}}]
(let [key-names (merge default-key-names key-names)
msg-key (or msg-key
(get key-names :msg))
Expand All @@ -153,12 +153,12 @@
(and (not inline-args?) (seq context)) {:args context}
(and inline-args? (seq context)) context
:else {})
log-map (-> (handle-vargs {:log-map base-log-map
:?msg-fmt ?msg-fmt
:vargs vargs
:inline-args? inline-args?
:msg-key msg-key
:collect-vargs collect-vargs})
log-map (-> (handle-vargs {:log-map base-log-map
:?msg-fmt ?msg-fmt
:vargs vargs
:inline-args? inline-args?
:msg-key msg-key
:collect-vargs-fn collect-vargs-fn})
;; apply base fields last to ensure they have precedent over context and vargs
(assoc (get key-names :timestamp) (force timestamp_))
(assoc level-key level)
Expand Down Expand Up @@ -204,15 +204,15 @@
`key-names`: Map of log key names. Can be used to override the default key names in `default-key-names`"
([]
(install nil))
([{:keys [level min-level pretty inline-args? level-key msg-key should-log-field-fn ex-data-field-fn key-names collect-vargs]
([{:keys [level min-level pretty inline-args? level-key msg-key should-log-field-fn ex-data-field-fn key-names collect-vargs-fn]
:or {pretty false
inline-args? true
should-log-field-fn default-should-log-field-fn
ex-data-field-fn default-ex-data-field-fn
key-names default-key-names
msg-key (:msg key-names)
level-key (:level key-names)
collect-vargs default-collect-vargs}}]
collect-vargs-fn default-collect-vargs-fn}}]
(timbre/set-config! {:min-level (or min-level level :info)
:appenders {:json (json-appender {:pretty pretty
:inline-args? inline-args?
Expand All @@ -221,7 +221,7 @@
:should-log-field-fn should-log-field-fn
:ex-data-field-fn ex-data-field-fn
:key-names key-names
:collect-vargs collect-vargs})}
:collect-vargs-fn collect-vargs-fn})}
:timestamp-opts {:pattern "yyyy-MM-dd'T'HH:mm:ssX"}})))

(defn log-success [request-method uri status]
Expand Down
40 changes: 37 additions & 3 deletions test/timbre_json_appender/core_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,25 @@
(timbre/info "plop" :a 1))))]
(is (nil? (get log field-filter)))))))

(defn final-map-as-args
[vargs]
(let [[message [args]] (split-at (dec (count vargs)) vargs)]
(if (map? args)
{:message (str/join " " message)
:args args}
{:message (str/join " " vargs)})))

(deftest collect-vargs-fn
(testing "custom collect-vargs fn"
(let [log (parse-string (with-out-str
(timbre/with-config {:level :info
:appenders {:json (sut/json-appender {:collect-vargs-fn final-map-as-args})}}
(timbre/info :status 200 :duration 5 {:status 300 :duration 10}))))]
(is (= ":status 200 :duration 5" (:msg log)))
(is (= nil (:status log)))
(is (= nil (:duration log)))
(is (= {:status 300 :duration 10} (:args log))))))

(deftest level-key-changes
(let [level-key-diff {:level :info :appenders {:json (sut/json-appender {})}}]
(testing "test key for info"
Expand Down Expand Up @@ -323,7 +342,7 @@
(finally
(timbre/set-config! old-config)))))

(testing "key-names should be used level and msg key when passed in and level-key and msg-key should override them"
(testing "key-names should be using level and msg key when passed in and level-key and msg-key should override them"
(let [old-config timbre/*config*]
(try
(sut/install {:should-log-field-fn (fn [field-name _data]
Expand All @@ -347,6 +366,21 @@
(is (not (contains? log :some-msg-key)))
(is (not (contains? log :some-level-key)))])
(finally
(timbre/set-config! old-config))))))
(timbre/set-config! old-config)))))

;; TODO: add tests for coolect-vargs
(testing "custom collect-vargs"
(let [old-config timbre/*config*]
(try
(sut/install {:collect-vargs-fn final-map-as-args})
(let [log (parse-string (with-out-str
(timbre/info "test":duration 5)))]
(is (= "test :duration 5" (:msg log)))
(is (= nil (:duration log))))
(let [log (parse-string (with-out-str
(timbre/info "test" :duration 5 {:duration 10
:status 200})))]
(is (= "test :duration 5" (:msg log)))
(is (= 10 (:duration log)))
(is (= 200 (:status log))))
(finally
(timbre/set-config! old-config))))))

0 comments on commit 4e280db

Please sign in to comment.