Skip to content

Commit ffb5213

Browse files
committed
Add ability to customize format of logged queries
1 parent 9bffcc7 commit ffb5213

File tree

2 files changed

+40
-8
lines changed

2 files changed

+40
-8
lines changed

src/duct/database/sql/hikaricp.clj

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,34 +16,34 @@
1616
(mapv query-parameters (.getParametersList query-info)))
1717

1818
(defn- logged-query [^QueryInfo query-info]
19-
(let [query (.getQuery query-info)
20-
params (query-parameter-lists query-info)]
19+
(let [query (.getQuery query-info)
20+
params (query-parameter-lists query-info)]
2121
(into [query] (if (= (count params) 1) (first params) params))))
2222

23-
(defn- logging-listener [logger]
23+
(defn- logging-listener [logger query-formatter]
2424
(reify QueryExecutionListener
2525
(beforeQuery [_ _ _])
2626
(afterQuery [_ exec-info query-infos]
2727
(let [elapsed (.getElapsedTime exec-info)
28-
queries (mapv logged-query query-infos)]
28+
queries (mapv (comp (or query-formatter identity) logged-query) query-infos)]
2929
(if (= (count queries) 1)
3030
(log/log logger :info ::sql/query {:query (first queries), :elapsed elapsed})
3131
(log/log logger :info ::sql/batch-query {:queries queries, :elapsed elapsed}))))))
3232

33-
(defn- wrap-logger [datasource logger]
33+
(defn- wrap-logger [datasource logger query-formatter]
3434
(doto (ProxyDataSource. datasource)
35-
(.addListener (logging-listener logger))))
35+
(.addListener (logging-listener logger query-formatter))))
3636

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

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

test/duct/database/sql/hikaricp_test.clj

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,35 @@
9595
(is (= (jdbc/query spec ["SELECT * FROM foo WHERE id = ? AND body = ?" 1 "a"])
9696
[{:id 1, :body "a"}]))
9797
(is (empty? @logs))))
98+
99+
(defn log-query-formatter [[query & params]]
100+
(into
101+
[(str (re-find #"^\w+" query) "...")]
102+
params))
103+
104+
(deftest formatted-logging-test
105+
(let [logs (atom [])
106+
logger (->AtomLogger logs)
107+
hikaricp (ig/init-key ::sql/hikaricp {:jdbc-url "jdbc:sqlite:" :logger logger :log-query-formatter log-query-formatter})
108+
spec (:spec hikaricp)]
109+
(jdbc/execute! spec ["CREATE TABLE foo (id INT, body TEXT)"])
110+
(jdbc/db-do-commands spec ["INSERT INTO foo VALUES (1, 'a')"
111+
"INSERT INTO foo VALUES (2, 'b')"])
112+
(is (= (jdbc/query spec ["SELECT * FROM foo"])
113+
[{:id 1, :body "a"} {:id 2, :body "b"}]))
114+
(is (= (jdbc/query spec ["SELECT * FROM foo WHERE id = ?" 1])
115+
[{:id 1, :body "a"}]))
116+
(is (= (jdbc/query spec ["SELECT * FROM foo WHERE id = ? AND body = ?" 1 "a"])
117+
[{:id 1, :body "a"}]))
118+
(is (every? nat-int? (map elapsed @logs)))
119+
(is (= (map remove-elapsed @logs)
120+
[[:info ::sql/query {:query ["CREATE..."]}]
121+
[:info ::sql/batch-query {:queries [["INSERT..."]
122+
["INSERT..."]]}]
123+
[:info ::sql/query {:query ["SELECT..."]}]
124+
[:info ::sql/query {:query ["SELECT..." 1]}]
125+
[:info ::sql/query
126+
{:query ["SELECT..." 1 "a"]}]]))
127+
(is (not (.isClosed (unwrap-logger (:datasource spec)))))
128+
(ig/halt-key! ::sql/hikaricp hikaricp)
129+
(is (.isClosed (unwrap-logger (:datasource spec))))))

0 commit comments

Comments
 (0)