Logging

CIDER Log Mode allows you to capture, debug, inspect and view log events emitted by Java logging frameworks. The captured log events can be searched, streamed to the client, pretty printed and are integrated with the CIDER Inspector and Stacktrace Mode. Here is a screenshot of CIDER Log Mode in action.

CIDER Log
The screenshot displays the list of log events in the *cider-log* buffer on the left. To the right, a log event is visible in the *cider-inspect* buffer, where the exception of the event is also displayed in the CIDER Stacktrace Mode. From the Stacktrace Mode buffer you can jump to the source of each frame. At the bottom the CIDER log menu is shown from which you can perform logging related actions.

Features

  • Browse Javadocs and website of log framework.

  • Search log events and show them in buffers.

  • Pretty Print log events.

  • Show log events in the CIDER Inspector

  • Show log event exceptions in the CIDER Stacktrace Mode

  • Integration with logview

Dependencies

Logview is an optional dependency of CIDER Log Mode. We recommend using it, since it is responsible for coloring the log events and it provides other useful features, such as syntax highlighting, filtering and more. It is used automatically when available and its use can be customized via cider-log-use-logview.

Usage

To use CIDER Log Mode, type C-c M-l l or M-x cider-log in any buffer that has a CIDER Sesman session attached to it. The first time you run the command, it will prompt you to select a log framework to use, and then attach a log appender to the root logger of the selected framework. After the log appender has been attached, the cider-log command will show a Transient menu, from which you can take further actions, like managing the log framework, appenders, consumers and events.

To view log events and stream them to your client, type es (Search log events) followed by s. This will open the *cider-log* buffer showing any log events captured thus far. It will also add a log consumer to this buffer, which receives newly-arriving log events.

The *cider-log* buffer might initially be empty, and you may see a No log events found message. This is because nothing has been logged between adding the appender and searching for events. So, now would be a good time to run some code that triggers a log event for the selected framework.

Keybindings

Command Keyboard shortcut Description

cider-log

C-c M-l l

Show the CIDER log menu.

cider-log-framework

C-c M-l f

Show the menu to manage a logging framework.

cider-log-appender

C-c M-l a

Show the menu to manage appenders of a logging framework.

cider-log-consumer

C-c M-l c

Show the menu to manage consumers listening to log events.

cider-log-event

C-c M-l e

Show the menu to manage log events.

Log framework

CIDER Log Mode supports log frameworks that allow reconfiguration at run time. More specifically the framework should support attaching log appenders to loggers, in order to capture events.

At the moment the following log frameworks are supported:

There is some work in progress to support Log4j as well, but there are some difficulties with configuration changes made at runtime, which are wiped out by the Log4j2 reconfiguration mechanism.

Keybindings

Command Keyboard shortcut Description

cider-log-set-framework

C-c M-l f s

Select the log framework to use.

cider-log-set-buffer

C-c M-l f b

Select the log buffer to user. Default: *cider-log*

cider-log-browse-javadocs

C-c M-l f j

Browse the Javadocs of the log framework.

cider-log-browse-website

C-c M-l f w

Browse the website of the log framework.

Log Appender

In order to capture log events, a log appender needs to be attached to a logger of a framework. Once an appender is attached to a logger it captures the log events emitted by the framework in an in-memory atom. A log appender can be configured to have a certain size (default: 100000) and a threshold in percentage (default: 10). Log events are cleared from the appender when threshold (appender size plus threshold) is reached. Additionally an appender can be configured to only capture events that match a set of filters.

Keybindings

The following keybindings can be used to interact with log appenders.

Command Keyboard shortcut Description

cider-log-appender

C-c M-l a

Show the transient menu to manage log appenders.

cider-log-add-appender

C-c M-l a a

Add a log appender to a logger.

cider-log-clear-appender

C-c M-l a c

Clear all captured events of a log appender.

cider-log-kill-appender

C-c M-l a k

Kill a log appender by removing it from the logger.

cider-log-update-appender

C-c M-l a u

Update the filters, size or threshold of a log appender.

Log Consumer

Log events can be streamed to a client by attaching a log consumer to an appender. Once a log consumer has been attached to an appender, it will receive events from the appender. Similar to log appenders, consumers can also be configured with a set of filters to only receive certain events.

Keybindings

The following keybindings can be used to interact with log consumers.

Command Main / Consumer Menu Keyboard shortcut Description

cider-log-consumer

C-c M-l c

Show the transient menu to manage log consumers.

cider-log-add-consumer

ca / a

C-c M-l c a

Add a log consumer to a log appender streaming event to the client.

cider-log-kill-consumer

ck / k

C-c M-l c k

Kill a log consumer and stop streaming events to the client.

cider-log-update-consumer

cu / u

C-c M-l c u

Update the filters of a log consumer to change which events are streamed to the client.

Log Event

Log events can be searched, streamed to a client or viewed in CIDER’s Inspector and Stacktrace Mode. When searching log events the user can specify a set of filters. Events that match the filters are shown in the *cider-log* buffer. Additionally a log consumer will be attached to the appender to receive log events matching the search criteria after the search command has been issued. The log appender will be removed automatically once a new search has been submitted or when the *cider-log* buffer gets killed.

Keybindings

The following keybindings can be used to interact with log events.

Command Keyboard shortcut Description

cider-log-event

C-c M-l e

Show the transient menu to manage log events.

cider-log-clear-event-buffer

C-c M-l e c

Clear all events from the log event buffer.

cider-log-show-stacktrace

C-c M-l e e

Show the stacktrace of the log event at point in the CIDER Stacktrace Mode.

cider-log-inspect-event

C-c M-l e i

Show the log event in the CIDER Inspector.

cider-log-print-event

C-c M-l e p

Pretty print the log event in the *cider-log-event* buffer.

cider-log-event-search

C-c M-l e s

Search log events and show them in the *cider-log* buffer.

Log Filters

Filters for log events can be attached to log appenders and consumers. They also take effect when searching events or streaming them to clients. If multiple filters are chosen they are combined using logical AND condition. The following filters are available:

Filter Keyboard shortcut Description

end-time

-e

Only include log events that were emitted before end-time.

exceptions

-E

Only include log events caused by an exception in the list of exceptions.

level

-l

Only include log events with a log level above level.

loggers

-L

Only include log events that were emitted by a logger in the list of loggers.

pattern

-r

Only include log events whose message matcches the regular expression pattern.

start-time

-s

Only include log events that were emitted at, or after start-time.

threads

-t

Only include log events that were emitted by a thread in the list of threads.