1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
|
.. _ui:
User Interface
==============
The **lnav** TUI displays the content of the current "view" in the middle,
with status bars above and below, and the interactive prompt as the last line.
.. figure:: lnav-ui.png
:align: center
:figwidth: 90%
Screenshot of **lnav** viewing syslog and web access_log messages.
The default view shows the log messages from the log files that have been
loaded. There are other views for displaying content like plaintext files
and SQL results. The :ref:`ui_views` section describes the characteristics of
each view in more detail. You can switch to the different views using the
hotkeys described in the :ref:`hotkeys_display` section or by pressing
:kbd:`ENTER` to activate the breadcrumb bar, moving to the first crumb, and
then selecting the desired view. You can switch back to the previous view by
pressing :kbd:`q`. You can switch forward to the new view by pressing
:kbd:`a`. If the views are time-based (e.g. log and histogram), pressing
:kbd:`Shift` + :kbd:`q` and :kbd:`Shift` + :kbd:`a` will synchronize the top
times in the views.
**lnav** provides many operations to work with the log/text data in the
main view. For example, you can add comments and tags to log messages.
The highlighted cursor line is used as the reference point to edit the
comment or tags. Alternatively, you can press :kbd:`Ctrl` + :kbd:`x`
to switch to "top" mode where the "focused" line is the top line in the
view and most operations now work with that line. When in "cursor" mode,
the :kbd:`↑` and :kbd:`↓` keys now move the focused line instead of scrolling
the view. Jumping to bookmarks, like errors, will also move the focused
line instead of moving the next error to the top of the view.
The right side of the display has a proportionally sized 'scrollbar' that
shows:
* the current position in the file;
* the locations of errors/warnings in the log files by using red or yellow
coloring;
* the locations of search hits by using a tick-mark pointing to the left;
* the locations of bookmarks by using a tick-mark pointing to the right.
Top Status Bar
--------------
The top status bar shows the current time and messages stored in the
:ref:`table_lnav_user_notifications` table.
Below the top status bar is the breadcrumb bar that displays the semantic
location of the focused line in the main view. For example, within a
pretty-printed JSON document, it will show the path to property at the top
of the view. The actual content of the bar depends on the current view and
will be updated as you navigate around the main view. The bar can also be
used to navigate around the document by focusing on it.
Breadcrumb Bar
--------------
.. figure:: lnav-breadcrumbs-help.png
:align: center
:figwidth: 90%
Screenshot of the breadcrumb bar focused and navigating the help text
To focus on the breadcrumb bar, press :kbd:`ENTER`. The :kbd:`←`/:kbd:`→`
cursor keys can be used to select a crumb and the :kbd:`↑`/:kbd:`↓` keys can
be used select a value of that crumb. To accept a value and drop focus on the
bar, press :kbd:`ENTER`. To accept a value and move to the next crumb, press
:kbd:`→`. Using :kbd:`→` makes it quicker to drill down into a document
without having to constantly switch focus. To drop focus on the bar without
accepting anything, press :kbd:`Escape`.
There are three types of crumbs:
* a dropdown where one of a limited set of values can be selected;
* a combobox where a value can be entered directly or selected;
* a numeric input for entering array indexes.
When a dropdown or combobox is selected, you can type part of the desired value
to filter the list of values. For example, the first crumb is always the
current view, typing in "hi" will filter the list down to the "HIST" value.
Configuration Panels
--------------------
.. figure:: lnav-config-header.png
:align: center
:figwidth: 90%
Screenshot of the header for the configuration panels when they are hidden.
After the main view content, there is a header bar for two configuration
panels: Files and Filters. These panels provide visual access to parts of
lnav's configuration. To access the panels, press the :kbd:`TAB` key.
To hide the panels again, press :kbd:`q`.
.. figure:: lnav-files-panel.png
:align: center
:figwidth: 90%
Screenshot of the files panel showing the loaded files.
The Files panel is open initially to display progress in loading files.
The following information can be displayed for each file:
* the "unique" portion of the path relative to the other files;
* the amount of data that has been indexed;
* the date range of log messages contained in the file;
* the errors that were encountered while trying to index the file;
* the notes recorded for files where some automatic action was taken,
like hiding the file if it was seen as a duplicate of another file.
.. figure:: lnav-filters-panel.png
:align: center
:figwidth: 90%
Screenshot of the filters panel showing an OUT and a disabled IN filter.
If the view supports filtering, there will be a status line showing the
following:
* the number of enabled filters and the total number of filters;
* the number of lines that are **not** displayed because of filtering.
To edit the filters, you can press TAB to change the focus from the main
view to the filter editor. The editor allows you to create, enable/disable,
and delete filters easily.
Bottom Status Bar
-----------------
The second to last line is the bottom status bar, which shows the following:
* the line number of the focused line, starting from zero;
* the location within the view, as a percentage;
* the current search hit, the total number of hits, and the search term;
* the loading indicator.
When the interactive prompt is active, this bar can show the prompt
description, help text, or error message.
Prompt
------
Finally, the last line on the display is where you can enter search
patterns and execute internal commands, such as converting a
unix-timestamp into a human-readable date. The following key-presses
will activate a corresponding prompt:
* :kbd:`/` - The search prompt. You can enter a PCRE2-flavored regular
expression to search for in the current view.
* :kbd:`:` - The command prompt. Commands are used to perform common
operations.
* :kbd:`;` - The SQL prompt. SQL queries can be used for log analysis
and manipulating **lnav**'s state.
* :kbd:`|` - The script prompt. Enter a path to the lnav script to
execute, along with the arguments to pass in.
The command-line is by the readline library, so the usual set of keyboard
shortcuts can be used for editing and moving within the command-line.
.. _ui_views:
Views
-----
The accessible content within lnav is separated into the following views.
LOG
^^^
The log view displays the log messages from any loaded log files in time
order. This view will be shown by default if any log files were detected.
If plain text files were also loaded, they will be available in the TEXT
view, which you can switch to by pressing :kbd:`t`.
On color displays, the log messages will be highlighted as follows:
* Errors will be colored in red;
* warnings will be yellow;
* search hits are reverse video;
* various color highlights will be applied to: IP addresses, SQL keywords,
XML tags, file and line numbers in Java backtraces, and quoted strings;
* "identifiers" in the messages will be randomly assigned colors based on their
content (works best on "xterm-256color" terminals).
.. note::
If the coloring is too much for your tastes, you can change to the
"grayscale" theme by entering the following command:
.. code-block:: lnav
:config /ui/theme grayscale
Timestamps in log messages will be rewritten to the local timezone (or the
timezone specified by :envvar:`TZ`) automatically if they include a
timezone component. If a file's timestamps do not include a timezone, they
will be treated as if they are from the local zone. You can change the zone
to use for these types of files using the
:ref:`:set-file-timezone<set_file_timezone>` command.
.. note::
If a log message has a timestamp that is out-of-order with its neighboring
messages, the timestamp will be highlighted in yellow. When one of these
messages is focused, an overlay will display the
difference between the "actual time" and the "received time". The "actual
time" is the original textual timestamp. The "received time" is the time
of an earlier message that is larger than this log message's time.
The source file name for each message can be displayed by scrolling left.
Scrolling left once will show the shortened version of the file name relative
to the other files that are loaded. In the shortened version, the unique
portion of the file name will be in square brackets. Scrolling left a second
time will show the full path.
The breadcrumb bar will show the following crumbs:
* the timestamp for the focused line;
* the log format for the focused line;
* the name of the file the focused line was pulled from;
* the "operation ID" of the focused log message, if it is supported by the log
format.
These crumbs are interactive and can be used to navigate to different parts
of the log view. For example, selecting a different value in the log format
crumb will jump to the first message with that format.
The file crumb will show a "↻" icon if the file is from the output of a FIFO,
:code:`:sh` command, or data that was piped into the standard input. When
the pipe is closed, the icon will disappear.
TEXT
^^^^
The text view displays files for which lnav could not detect any log messages.
Press :kbd:`t` to switch to the text view. While in the text view, you can
press :kbd:`f` or :kbd:`Shift` + :kbd:`F` to switch to the next / previous
text file.
The breadcrumb bar will show the name of the file and any structure that was
discovered in the content. The file crumb will show a "↻" icon if the file
is from the output of a FIFO, :code:`:sh` command, or data that was piped
into the standard input. When the pipe is closed, the icon will disappear.
If the content is piped into lnav through standard input, a FIFO, or a
:code:`:sh` command, the time that lines are received are recorded. You
can press :kbd:`Shift` + :kbd:`T` to view the elapsed time like in the
LOG view. The breadcrumb bar will also show the received time of the
focused line after the file name crumb. If the output being shown is from
a :code:`:sh` command, you can press :kbd:`Ctrl` + :kbd:`C` to send a
SIGINT to the child process without killing **lnav** itself.
.. figure:: lnav-make-check-log.png
:align: center
:figwidth: 90%
Screenshot of the TEXT view showing the output of :code:`sh make check`.
Each line is timestamped internally when it was received so it's
possible to view how long each test is taking to run. The "↻" icon
next to the file name in the breadcrumb bar means that the make is
still running.
Markdown
""""""""
Files with an :code:`.md` (or :code:`.markdown`) extension will be treated as
Markdown files and rendered separately.
.. figure:: lnav-markdown-example.png
:align: center
Viewing the **lnav** :file:`README.md` file.
DB
^^
The DB view shows the results of queries done through the SQLite interface.
You can execute a query by pressing :kbd:`;` and then entering a SQL statement.
Press :kbd:`v` to switch to the database result view.
HELP
^^^^
The help view displays the builtin help text. While in the help view, the
breadcrumb bar can be used to navigate to different sections of the document.
Press :kbd:`?` to switch to the help view.
HIST
^^^^
The histogram view displays a stacked bar chart of messages over time
classified by their log level and whether they've been bookmarked.
Press :kbd:`i` to switch back and forth to the histogram view. You
can also press :kbd:`Shift` + :kbd:`i` to toggle the histogram view
while synchronizing the top time. While in the histogram view,
pressing :kbd:`z` / :kbd:`Shift` + :kbd:`z` will zoom in/out.
GANTT
^^^^^
.. note:: This feature is available in v0.12.0+.
.. figure:: lnav-gantt-1.png
:align: center
Screenshot of the Gantt chart view when viewing logs from the
VMWare Update Manager. Most rows show API requests as they
are received and processed.
The Gantt Chart view visualizes operations over time. The operations
are identified by the "opid" field defined in the log format. In the
view, there is a header that shows the overall time span, the
narrowed time span around the focused line, and the column headers.
Each row in the view shows the following:
* The duration of the operation
* Sparklines showing the number of errors and warnings relative to the
total number of messages associated with the OPID.
* The OPID itself.
* A description of the operation as captured from the log messages.
The rows are sorted by the start time of each operation.
If an operation row is in the focused time span, a reverse-video
bar will show when the operation started and finished (unless it
extends outside the time span). As you move the focused line, the
focused time span will be adjusted to keep the preceding and following
five operations within the span.
The preview panel at the bottom of the display will show the
messages associated with the focused operation.
The following hotkeys can be useful in this view:
* :kbd:`p` -- If the log format defined sub-operations with the
:code:`opid/subid` property, this will toggle an overlay panel
that displays the sub-operation descriptions.
.. figure:: lnav-gantt-2.png
:align: center
Screenshot showing the same log as above after pressing
:kbd:`p`. The overlay panel shows a breakdown of
sub-operations performed while processing the main operation.
* :kbd:`Shift` + :kbd:`q` -- Return to the previous view and change
its focused line to match the time that was focused in the gantt
view.
* :kbd:`Shift` + :kbd:`a` -- After leaving the gantt view, pressing
these keys will return to the Gantt view while keeping the focused
time in sync.
PRETTY
^^^^^^
The pretty-print view takes the text displayed in the current view and shows
the result of a pretty-printer run on that text. For example, if a log
message contained an XML message on a single line, the pretty-printer would
break the XML across multiple lines with appropriate indentation.
.. figure:: lnav-pretty-view-before.png
:align: center
:figwidth: 90%
Screenshot of a log message with a flat JSON object.
.. figure:: lnav-pretty-view-after.png
:align: center
:figwidth: 90%
Screenshot of the same log message in the PRETTY view. The JSON object
is now indented for easier reading.
Press :kbd:`Shift` + :kbd:`P` to switch to the pretty-print view.
SCHEMA
^^^^^^
The schema view displays the current schema of the builtin SQLite database.
Press :kbd:`;` to enter the SQL prompt and then enter :code:`.schema` to
open the schema view.
SPECTRO
^^^^^^^
The spectrogram view is a "three"-dimensional display of data points of a log
field or a SQL query column. The dimensions are time on the Y axis, the range
of data point values on the X axis, and the number of data points as a color.
For example, if you were to visualize process CPU usage over time, the range
of values on the X axis would be CPU percentages and there would be colored
blocks at each point on the line where a process had that CPU percentage, like
so
.. figure:: lnav-spectro-cpu-pct.png
:align: center
Screenshot of the **lnav** spectrogram view showing CPU usage of processes.
The colors correspond to the relative number of data points in a bucket.
The legend overlaid at the top line in the view shows the counts of data
points that are in a particular color, with green having the fewest number of
data points, yellow the middle, and red the most. You can select a particular
bucket using the cursor keys to see the exact number of data points and the
range of values. The panel at the bottom of the view shows the data points
themselves from the original source, the log file or the SQL query results.
You can press :kbd:`TAB` to focus on the details panel so you can scroll
around and get a closer look at the values.
.. _ui_mouse:
Mouse Support (v0.12.2+)
------------------------
With mouse support enabled, either through the `/ui/mouse/mode`
configuration option or by pressing :kbd:`F2`, many of the UI
elements will respond to mouse inputs:
* clicking on the main view will move the cursor to the given
row and dragging will scroll the view as needed;
* double-clicking in the main view will select the underlying
text and drag-selecting within a line will select the given
text;
* when double-clicking text: if the mouse pointer is inside
a quoted string, the contents of the string will be selected;
if the mouse pointer is on the quote, the quote will be included
in the selection; if the mouse pointer is over a bracket
(e.g. [],{},()) where the matching bracket is on the same line,
the selection will span from one bracket to the other;
* when text is selected, a menu will pop up that can be used
to filter based on the current text, search for it, or copy
it to the clipboard;
* right-clicking the start of a log message in the main view
will open the parser details overlay;
* the parser details now displays a diamond next to fields to
indicate whether they are shown/hidden and this can be
clicked to toggle the state;
* the parser details will show a bar chart icon for fields with
values which, when clicked, will open either the spectrogram
view for the given field or open the DB query prompt with a
PRQL query to generate a histogram of the field values;
* clicking in the scroll area will move the view by a page,
double-clicking will move the view to that area, and
dragging the scrollbar will move the view to the given spot;
* clicking on the breadcrumb bar will select a crumb and
selecting a possibility from the popup will move to that
location in the view;
* clicking on portions of the bottom status bar will trigger
a relevant action (e.g. clicking the line number will open
the command prompt with :code:`:goto <current-line>`);
* clicking on the configuration panel tabs (i.e. Files/Filters)
will open the selected panel and clicking parts of the
display in there will perform the relevant action (e.g.
clicking the diamond will enable/disable the file/filter);
* clicking in a prompt will move the cursor to the location;
* clicking on a column in the spectrogram view will select it.
.. note::
A downside of enabling mouse support is that normal text
selection and copy will no longer work. While lnav has
some support for selection in the main view, there are
still likely to be cases where that is insufficient.
In those cases, you can press :kbd:`F2` to quickly
switch back-and-forth. Or, some terminals have support
for switching while a modifier is pressed:
.. list-table::
:header-rows: 1
* - Key
- Terminal
* - :kbd:`Option`
- iTerm, Hyper
* - :kbd:`Fn`
- Terminal.app
|