Skip to content

Commit 36bb844

Browse files
r0manbbatsov
authored andcommitted
Add CIDER log middleware
1 parent cff4531 commit 36bb844

File tree

11 files changed

+962
-1
lines changed

11 files changed

+962
-1
lines changed

.clj-kondo/config.edn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{:hooks {:analyze-call {cider.nrepl.middleware.out/with-out-binding
22
hooks.core/with-out-binding}}
3+
:lint-as {cider.nrepl.middleware.log-test/with-each-framework clojure.core/let}
34
:linters {:unresolved-symbol {:exclude [(cider.nrepl/def-wrapper)
45
(cider.nrepl.middleware.util.instrument/definstrumenter)
56
(cider.nrepl.middleware.util.instrument/with-break)

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## master (unreleased)
44

5+
### New features
6+
7+
* [#773](https://github.com/clojure-emacs/cider-nrepl/pull/773) Add middleware to capture, debug, inspect and view log events emitted by Java logging frameworks.
8+
59
### Changes
610

711
* Bump `orchard` to 0.12.0.

doc/modules/ROOT/pages/nrepl-api/supplied_middleware.adoc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@
5757
| `inspect-(start/refresh/pop/push/reset/get-path)`
5858
| Inspect a Clojure expression.
5959

60+
| `wrap-log`
61+
| 0.30.1
62+
| No
63+
| `cider/log-add-appender`, `cider/log-add-consumer`, `cider/log-analyze-stacktrace`, `cider/log-clear-appender`, `cider/log-exceptions`, `cider/log-format-event`, `cider/log-frameworks`, `cider/log-inspect-event`, `cider/log-levels`, `cider/log-loggers`, `cider/log-remove-appender`, `cider/log-remove-consumer`, `cider/log-search`, `cider/log-update-appender`, `cider/log-update-consumer`, `cider/log-threads`
64+
| Capture, debug, inspect and view log events emitted by Java logging frameworks.
65+
6066
| `wrap-macroexpand`
6167
| -
6268
| Yes

doc/modules/ROOT/pages/usage.adoc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ under `:repl-options`.
4141
cider.nrepl/wrap-format
4242
cider.nrepl/wrap-info
4343
cider.nrepl/wrap-inspect
44+
cider.nrepl/wrap-log
4445
cider.nrepl/wrap-macroexpand
4546
cider.nrepl/wrap-ns
4647
cider.nrepl/wrap-spec
@@ -153,6 +154,7 @@ That's how CIDER's nREPL handler is created:
153154
cider.nrepl/wrap-format
154155
cider.nrepl/wrap-info
155156
cider.nrepl/wrap-inspect
157+
cider.nrepl/wrap-log
156158
cider.nrepl/wrap-macroexpand
157159
cider.nrepl/wrap-ns
158160
cider.nrepl/wrap-out

project.clj

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
^:inline-dep [cljfmt "0.9.2" :exclusions [org.clojure/clojurescript]]
1919
^:inline-dep [org.clojure/tools.namespace "1.3.0"]
2020
^:inline-dep [org.clojure/tools.trace "0.7.11"]
21-
^:inline-dep [org.clojure/tools.reader "1.3.6"]]
21+
^:inline-dep [org.clojure/tools.reader "1.3.6"]
22+
[mx.cider/logjam "0.1.1"]]
2223
:exclusions [org.clojure/clojure] ; see Clojure version matrix in profiles below
2324

2425
:pedantic? ~(if (System/getenv "CI")
@@ -102,9 +103,13 @@
102103
:test {:global-vars {*assert* true}
103104
:source-paths ["test/src"]
104105
:java-source-paths ["test/java"]
106+
:jvm-opts ["-Djava.util.logging.config.file=test/resources/logging.properties"]
105107
:resource-paths ["test/resources"]
106108
:dependencies [[boot/base "2.8.3"]
107109
[boot/core "2.8.3"]
110+
;; 1.3.7 and 1.4.7 are working, but we need 1.3.7 for JDK8
111+
[ch.qos.logback/logback-classic "1.3.7"]
112+
[org.clojure/test.check "1.1.1"]
108113
[org.apache.httpcomponents/httpclient "4.5.13" :exclusions [commons-logging]]
109114
[leiningen-core "2.9.10" :exclusions [org.clojure/clojure
110115
commons-codec

src/cider/nrepl.clj

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,136 @@ Depending on the type of the return value of the evaluation this middleware may
284284
"var-name" "The var name"}
285285
:returns {"status" "\"done\""}}}}))
286286

287+
(def-wrapper wrap-log cider.nrepl.middleware.log/handle-log
288+
{:doc "Middleware that captures log events and makes them inspect-able."
289+
:requires #{#'session #'wrap-print}
290+
:handles
291+
{"cider/log-add-appender"
292+
{:doc "Add an appender to a log framework."
293+
:requires {"framework" "The id of the log framework."
294+
"appender" "The name of the appender."
295+
"filters" "A map from filter name to filter condition."
296+
"size" "The number of events the appender keeps in memory."
297+
"threshold" "The threshold in percent used to cleanup events."}
298+
:optional {"logger" "The name of the logger to attach to."}
299+
:returns {"status" "done"
300+
"cider/log-add-appender" "The appender that was added."}}
301+
302+
"cider/log-add-consumer"
303+
{:doc "Add a consumer to an appender of a log framework."
304+
:requires {"framework" "The id of the log framework."
305+
"appender" "The name of the appender."
306+
"filters" "A map from filter name to filter condition."}
307+
:returns {"status" "done"
308+
"cider/log-add-consumer" "The consumer that was added."}}
309+
310+
"cider/log-analyze-stacktrace"
311+
{:doc "Analyze the stacktrace of a log event."
312+
:requires {"framework" "The id of the log framework."
313+
"appender" "The name of the appender."
314+
"event" "The id of the event to inspect."}
315+
:returns {"status" "done"}}
316+
317+
"cider/log-clear-appender"
318+
{:doc "Clear all events of a log appender."
319+
:requires {"framework" "The id of the log framework."
320+
"appender" "The name of the appender."}
321+
:returns {"status" "done"
322+
"cider/log-clear-appender" "The appender that was cleared."}}
323+
324+
"cider/log-exceptions"
325+
{:doc "Return the exceptions and their frequencies for the given framework and appender."
326+
:requires {"framework" "The id of the log framework."
327+
"appender" "The name of the appender."}
328+
:returns {"status" "done"
329+
"cider/log-exceptions" "A map from exception name to event frequency."}}
330+
331+
"cider/log-frameworks"
332+
{:doc "Return the available log frameworks."
333+
:returns {"status" "done"
334+
"cider/log-frameworks" "A list of log frameworks."}}
335+
336+
"cider/log-format-event"
337+
{:doc "Format a log event."
338+
:requires {"framework" "The id of the log framework."
339+
"appender" "The name of the log appender."
340+
"event" "The id of the log event."}
341+
:optional wrap-print-optional-arguments
342+
:returns {"status" "done"
343+
"cider/log-format-event" "The formatted log event."}}
344+
345+
"cider/log-inspect-event"
346+
{:doc "Inspect a log event."
347+
:requires {"framework" "The id of the log framework."
348+
"appender" "The name of the appender."
349+
"event" "The id of the event to inspect."}
350+
:returns {"status" "done"
351+
"value" "The inspection result."}}
352+
353+
"cider/log-levels"
354+
{:doc "Return the log levels and their frequencies for the given framework and appender."
355+
:requires {"framework" "The id of the log framework."
356+
"appender" "The name of the appender."}
357+
:returns {"status" "done"
358+
"cider/log-levels" "A map from log level to event frequency."}}
359+
360+
"cider/log-loggers"
361+
{:doc "Return the loggers and their frequencies for the given framework and appender."
362+
:requires {"framework" "The id of the log framework."
363+
"appender" "The name of the appender."}
364+
:returns {"status" "done"
365+
"cider/log-loggers" "A map from logger name to event frequency."}}
366+
367+
"cider/log-remove-appender"
368+
{:doc "Remove an appender from a log framework."
369+
:requires {"framework" "The id of the log framework."
370+
"appender" "The name of the appender."}
371+
:returns {"status" "done"
372+
"cider/log-remove-appender" "The removed appender."}}
373+
374+
"cider/log-remove-consumer"
375+
{:doc "Remove a consumer from the appender of a log framework."
376+
:requires {"framework" "The id of the log framework."
377+
"appender" "The name of the appender."
378+
"consumer" "The name of the consumer."}
379+
:returns {"status" "done"
380+
"cider/log-add-consumer" "The removed consumer."}}
381+
382+
"cider/log-update-appender"
383+
{:doc "Update the appender of a log framework."
384+
:requires {"framework" "The id of the log framework."
385+
"appender" "The name of the appender."
386+
"filters" "A map from filter name to filter condition."
387+
"size" "The number of events the appender keeps in memory."
388+
"threshold" "The threshold in percent used to cleanup events."}
389+
:returns {"status" "done"
390+
"cider/log-update-appender" "The updated appender."}}
391+
392+
"cider/log-update-consumer"
393+
{:doc "Update the consumer of a log appender."
394+
:requires {"framework" "The id of the log framework."
395+
"appender" "The name of the appender."
396+
"consumer" "The name of the consumer."
397+
"filters" "A map from filter name to filter condition."}
398+
:returns {"status" "done"
399+
"cider/log-update-consumer" "The consumer that was updated."}}
400+
401+
"cider/log-search"
402+
{:doc "Search the log events of an appender."
403+
:requires {"framework" "The id of the log framework."
404+
"appender" "The name of the appender."}
405+
:optional {"filters" "A map from filter name to filter condition."
406+
"limit" "Number of log events to return."}
407+
:returns {"status" "done"
408+
"cider/log-search" "The list of log events matching the search."}}
409+
410+
"cider/log-threads"
411+
{:doc "Return the threads and their frequencies for the given framework and appender."
412+
:requires {"framework" "The id of the log framework."
413+
"appender" "The name of the appender."}
414+
:returns {"status" "done"
415+
"cider/log-threads" "A map from thread name to event frequency."}}}})
416+
287417
(def-wrapper wrap-macroexpand cider.nrepl.middleware.macroexpand/handle-macroexpand
288418
(cljs/requires-piggieback
289419
{:doc "Macroexpansion middleware."

src/cider/nrepl/middleware.clj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
cider.nrepl/wrap-format
1717
cider.nrepl/wrap-info
1818
cider.nrepl/wrap-inspect
19+
cider.nrepl/wrap-log
1920
cider.nrepl/wrap-macroexpand
2021
cider.nrepl/wrap-ns
2122
cider.nrepl/wrap-out

0 commit comments

Comments
 (0)