Skip to content

Commit

Permalink
Add ability to customize format of logged queries
Browse files Browse the repository at this point in the history
  • Loading branch information
danielytics committed Oct 21, 2020
1 parent 9bffcc7 commit 0a8c6c1
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 7 deletions.
20 changes: 13 additions & 7 deletions src/duct/database/sql/hikaricp.clj
Original file line number Diff line number Diff line change
Expand Up @@ -15,35 +15,41 @@
(defn- query-parameter-lists [^QueryInfo query-info]
(mapv query-parameters (.getParametersList query-info)))

(defn- logged-query [^QueryInfo query-info]
(defn- logged-query [format-query ^QueryInfo query-info]
(let [query (.getQuery query-info)
params (query-parameter-lists query-info)]
(cond-> (into [query] (if (= (count params) 1) (first params) params))
format-query (format-query))))

(defn- logged-query [^QueryInfo query-info]
(let [query (.getQuery query-info)
params (query-parameter-lists query-info)]
(into [query] (if (= (count params) 1) (first params) params))))

(defn- logging-listener [logger]
(defn- logging-listener [logger query-formatter]
(reify QueryExecutionListener
(beforeQuery [_ _ _])
(afterQuery [_ exec-info query-infos]
(let [elapsed (.getElapsedTime exec-info)
queries (mapv logged-query query-infos)]
queries (mapv (comp (or query-formatter identity) logged-query) query-infos)]
(if (= (count queries) 1)
(log/log logger :info ::sql/query {:query (first queries), :elapsed elapsed})
(log/log logger :info ::sql/batch-query {:queries queries, :elapsed elapsed}))))))

(defn- wrap-logger [datasource logger]
(defn- wrap-logger [datasource logger query-formatter]
(doto (ProxyDataSource. datasource)
(.addListener (logging-listener logger))))
(.addListener (logging-listener logger query-formatter))))

(defn- unwrap-logger [^DataSource datasource]
(.unwrap datasource DataSource))

(defmethod ig/init-key :duct.database.sql/hikaricp
[_ {:keys [logger connection-uri jdbc-url] :as options}]
[_ {:keys [logger connection-uri jdbc-url log-query-formatter] :as options}]
(let [datasource (-> (dissoc options :logger)
(assoc :jdbc-url (or jdbc-url connection-uri))
(hikari-cp/make-datasource))]
(if logger
(-> (sql/->Boundary {:datasource (wrap-logger datasource logger)})
(-> (sql/->Boundary {:datasource (wrap-logger datasource logger log-query-formatter)})
(assoc :unlogged-spec {:datasource datasource}))
(sql/->Boundary {:datasource datasource}))))

Expand Down
32 changes: 32 additions & 0 deletions test/duct/database/sql/hikaricp_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -95,3 +95,35 @@
(is (= (jdbc/query spec ["SELECT * FROM foo WHERE id = ? AND body = ?" 1 "a"])
[{:id 1, :body "a"}]))
(is (empty? @logs))))

(defn log-query-formatter [[query & params]]
(into
[(str (re-find #"^\w+" query) "...")]
params))

(deftest formatted-logging-test
(let [logs (atom [])
logger (->AtomLogger logs)
hikaricp (ig/init-key ::sql/hikaricp {:jdbc-url "jdbc:sqlite:" :logger logger :log-query-formatter log-query-formatter})
spec (:spec hikaricp)]
(jdbc/execute! spec ["CREATE TABLE foo (id INT, body TEXT)"])
(jdbc/db-do-commands spec ["INSERT INTO foo VALUES (1, 'a')"
"INSERT INTO foo VALUES (2, 'b')"])
(is (= (jdbc/query spec ["SELECT * FROM foo"])
[{:id 1, :body "a"} {:id 2, :body "b"}]))
(is (= (jdbc/query spec ["SELECT * FROM foo WHERE id = ?" 1])
[{:id 1, :body "a"}]))
(is (= (jdbc/query spec ["SELECT * FROM foo WHERE id = ? AND body = ?" 1 "a"])
[{:id 1, :body "a"}]))
(is (every? nat-int? (map elapsed @logs)))
(is (= (map remove-elapsed @logs)
[[:info ::sql/query {:query ["CREATE..."]}]
[:info ::sql/batch-query {:queries [["INSERT..."]
["INSERT..."]]}]
[:info ::sql/query {:query ["SELECT..."]}]
[:info ::sql/query {:query ["SELECT..." 1]}]
[:info ::sql/query
{:query ["SELECT..." 1 "a"]}]]))
(is (not (.isClosed (unwrap-logger (:datasource spec)))))
(ig/halt-key! ::sql/hikaricp hikaricp)
(is (.isClosed (unwrap-logger (:datasource spec))))))

0 comments on commit 0a8c6c1

Please sign in to comment.