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
|
.. _Configuration:
Configuration
=============
The configuration for **lnav** is stored in the following JSON files
where :file:`<lnav-home>` refers to the location in the :envvar:`HOME`
directory where files are stored, either (:file:`~/.lnav` or
:file:`~/.config/lnav`):
#. Builtin -- The default configuration is shipped inside the **lnav** binary.
#. :file:`/etc/lnav/configs/*/*.json` -- System-wide configuration files can
be installed here to make it available to all users.
#. :file:`<lnav-home>/configs/default/*.json` -- The default configuration
files that are built into lnav are written to this directory with :file:`.sample`
appended. Removing the :file:`.sample` extension and editing the file will
allow you to do basic customizations.
#. :file:`<lnav-home>/configs/*/*.json` -- Other directories that contain :file:`*.json`
files will be loaded on startup. This structure is convenient for installing
**lnav** configurations, like from a git repository. The :file:`configs/installed`
directory is reserved for files that are installed using the :option:`-i`
flag (e.g. :code:`$ lnav -i /path/to/config.json`).
#. :file:`-I <path>/configs/*/*.json` -- Include directories passed on the
command-line can have a :file:`configs` directory that will also be searched.
#. :file:`<lnav-home>/config.json` -- Contains local customizations that were
done using the :code:`:config` command.
A valid **lnav** configuration file must contain an object with the
:code:`$schema` property, like so:
.. code-block:: json
{
"$schema": "https://lnav.org/schemas/config-v1.schema.json"
}
.. note::
Log format definitions are stored separately in the :file:`~/.lnav/formats`
directly. See the :ref:`Log Formats<log_formats>` chapter for more
information.
.. note::
Configuration files are read in the above directory order and sorted
by path name. The internal configuration is updated as files are
parsed, so one file can overwrite the settings from another. You can
use the :ref:`Management CLI<management_cli>` to get the final
configuration and where the value came from for a particular
configuration option.
Options
-------
The following configuration options can be used to customize the **lnav** UI to
your liking. The options can be changed using the :code:`:config` command.
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/ui/properties/keymap
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/ui/properties/theme
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/ui/properties/clock-format
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/ui/properties/dim-text
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/ui/properties/default-colors
.. _themes:
Theme Definitions
-----------------
User Interface themes are defined in a JSON configuration file. A theme is
made up of the style definitions for different types of text in the UI. A
:ref:`definition<theme_style>` can include the foreground/background colors
and the bold/underline attributes. The style definitions are broken up into
multiple categories for the sake of organization. To make it easier to write
a definition, a theme can define variables that can be referenced as color
values.
Variables
^^^^^^^^^
The :code:`vars` object in a theme definition contains the mapping of variable
names to color values. These variables can be referenced in style definitions
by prefixing them with a dollar-sign (e.g. :code:`$black`). The following
variables can also be defined to control the values of the ANSI colors that
are log messages or plain text:
.. csv-table:: ANSI colors
:header: "Variable Name", "ANSI Escape"
"black", "ESC[30m"
"red", "ESC[31m"
"green", "ESC[32m"
"yellow", "ESC[33m"
"blue", "ESC[34m"
"magenta", "ESC[35m"
"cyan", "ESC[36m"
"white", "ESC[37m"
Specifying Colors
^^^^^^^^^^^^^^^^^
Colors can be specified using hexadecimal notation by starting with a hash
(e.g. :code:`#aabbcc`) or using a color name as found at
http://jonasjacek.github.io/colors/. If colors are not specified for a style,
the values from the :code:`styles/text` definition.
.. note::
When specifying colors in hexadecimal notation, you do not need to have an
exact match in the XTerm 256 color palette. A best approximation will be
picked based on the `CIEDE2000 <https://en.wikipedia.org/wiki/Color_difference#CIEDE2000>`_
color difference algorithm.
Example
^^^^^^^
The following example sets the black/background color for text to a dark grey
using a variable and sets the foreground to an off-white. This theme is
incomplete, but it works enough to give you an idea of how a theme is defined.
You can copy the code block, save it to a file in
:file:`~/.lnav/configs/installed/` and then activate it by executing
:code:`:config /ui/theme example` in lnav. For a more complete theme
definition, see one of the definitions built into **lnav**, like
`monocai <https://github.com/tstack/lnav/blob/master/src/themes/monocai.json>`_.
.. code-block:: json
{
"$schema": "https://lnav.org/schemas/config-v1.schema.json",
"ui": {
"theme-defs": {
"example1": {
"vars": {
"black": "#2d2a2e"
},
"styles": {
"text": {
"color": "#f6f6f6",
"background-color": "$black"
}
}
}
}
}
}
Reference
^^^^^^^^^
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/ui/properties/theme-defs/patternProperties/^([\w\-]+)$/properties/vars
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/ui/properties/theme-defs/patternProperties/^([\w\-]+)$/properties/styles
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/ui/properties/theme-defs/patternProperties/^([\w\-]+)$/properties/syntax-styles
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/ui/properties/theme-defs/patternProperties/^([\w\-]+)$/properties/status-styles
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/ui/properties/theme-defs/patternProperties/^([\w\-]+)$/properties/log-level-styles
.. _theme_style:
.. jsonschema:: ../schemas/config-v1.schema.json#/definitions/style
.. _keymaps:
Keymap Definitions
------------------
Keymaps in **lnav** map a key sequence to a command to execute. When a key is
pressed, it is converted into a hex-encoded string that is looked up in the
keymap. The :code:`command` value associated with the entry in the keymap is
then executed. Note that the "command" can be an **lnav**
:ref:`command<commands>`, a :ref:`SQL statement/query<sql-ext>`, or an
**lnav** script. If an :code:`alt-msg` value is included in the entry, the
bottom-right section of the UI will be updated with the help text.
.. note::
Not all functionality is available via commands or SQL at the moment. Also,
some hotkeys are not implemented via keymaps.
Key Sequence Encoding
^^^^^^^^^^^^^^^^^^^^^
Key presses are converted into a hex-encoded string that is used to lookup an
entry in the keymap. Each byte of the keypress value is formatted as an
:code:`x` followed by the hex-encoding in lowercase. For example, the encoding
for the £ key would be :code:`xc2xa3`. To make it easier to discover the
encoding for unassigned keys, **lnav** will print in the command prompt the
:code:`:config` command and
`JSON-Pointer <https://tools.ietf.org/html/rfc6901>`_ for assigning a command
to the key.
.. figure:: key-encoding-prompt.png
:align: center
Screenshot of the command prompt when an unassigned key is pressed.
.. note::
Since **lnav** is a terminal application, it can only receive keypresses that
can be represented as characters or escape sequences. For example, it cannot
handle the press of a modifier key.
Reference
^^^^^^^^^
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/ui/properties/keymap-defs/patternProperties/^([\w\-]+)$
Log Handling
------------
The handling of logs is largely determined by the
:ref:`log file formats<log_formats>`, this section covers options that are not
specific to a particular format.
Timezone Conversion (v0.12.0+)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Log messages that have a numeric timezone, like :code:`-03:00` or :code:`Z`
for UTC, will be converted to the local timezone as given by the :envvar:`TZ`
environment variable. For example, a timestamp ending in `-03:00` will be treated
as three hours behind UTC and then adjusted to the local timezone.
This behavior can be disabled by setting the
:code:`/log/date-time/convert-zoned-to-local` configuration property to
:code:`false`.
Watch Expressions (v0.11.0+)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Watch expressions can be used to fire an event when a log message matches a
condition. You can then install a listener for these events and trigger an
action to be performed. For example, to automate filtering based on
identifiers, a watch expression can match messages that mention the ID and then
a trigger can install a filter for that ID. Creating a watch expression is
done by adding an entry into the :code:`/log/watch-expressions` configuration
tree. For example, to create a watch named "dhcpdiscover" that matches
DHCPDISCOVER messages from the :code:`dhclient` daemon, you would run the
following:
.. code-block:: lnav
:config /log/watch-expressions/dhcpdiscover/expr :log_procname = 'dhclient' AND startswith(:log_body, 'DHCPDISCOVER')
The watch expression can refer to column names in the log message by prefixing
them with a colon. The expression is evaluated by passing the log message
fields as bound parameters and not against a table. The easiest way to test
out an expression is with the :ref:`mark_expr` command, since it will behave
similarly. After changing the configuration, you'll need to restart lnav
for the effect to take place. You can then query the :code:`lnav_events`
table to see any generated
:code:`https://lnav.org/event-log-msg-detected-v1.schema.json` events from the
logs that were loaded:
.. code-block:: custsqlite
;SELECT * FROM lnav_events
From there, you can create a SQLite trigger on the :code:`lnav_events` table
that will examine the event contents and perform an action. See the
:ref:`Events` section for more information on handling events.
Annotations (v0.12.0+)
^^^^^^^^^^^^^^^^^^^^^^
Annotations are content generated by a script for a given log message and
displayed along with the message, like comments and tags. Since the script
is run asynchronously, it can do complex analysis without delaying loading
or interrupting the viewing experience. An annotation is defined by a
condition and a handler in the **lnav** configuration. The condition is
tested against a log message to determine if the annotation is applicable.
If it is, the handler script will be executed for that log message when
the user runs the :ref:`:annotate<annotate>` command.
Conditions are SQLite expressions like the ones passed to
:ref:`:filter-expr<filter_expr>` where the expression is appended to
:code:`SELECT 1 WHERE`. The expression can use bound variables that
correspond to the columns that would be in the format table and are
prefixed by a colon (:code:`:`). For example, the standard
:code:`log_opid` table column can be access by using :code:`:log_opid`.
.. note:: The expression is executed with bound variables because it
can be applied to log messages from multiple formats. Writing an
expression that could handle different formats would be more
challenging. In this approach, variables for log message fields
that are not part of a format will evaluate to :code:`NULL`.
Handlers are executable script files that should be co-located with
the configuration file that defined the annotation. The handler will
be executed and a JSON object with log message data fed in on the
standard input. The handler should then generate the annotation
content on the standard output. The output is treated as Markdown,
so the content can be styled as desired.
Reference
^^^^^^^^^
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/log/properties/watch-expressions/patternProperties/^([\w\.\-]+)$
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/log/properties/annotations/patternProperties/^([\w\.\-]+)$
.. _tuning:
Tuning
------
The following configuration options can be used to tune the internals of
**lnav** to your liking. The options can be changed using the :code:`:config`
command.
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/tuning/properties/archive-manager
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/tuning/properties/clipboard
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/tuning/properties/piper
.. jsonschema:: ../schemas/config-v1.schema.json#/definitions/clip-commands
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/tuning/properties/file-vtab
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/tuning/properties/logfile
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/tuning/properties/remote/properties/ssh
.. _url_scheme:
.. jsonschema:: ../schemas/config-v1.schema.json#/properties/tuning/properties/url-scheme
|