Journald¶
journald
is the native logging system on Linux operating systems that use systemd
with support for structured, indexed log storage.
Eliot provides native journald
support, with the following features:
- The default message field (
MESSAGE
) stores the Eliot message as JSON. - Failed actions get priority 3 (“err”) and tracebacks get priority 2 (“crit”).
- The
ELIOT_TASK
field stores the task UUID. - The
ELIOT_TYPE
field stores the message or action type if available. - The
SYSLOG_IDENTIFIER
storessys.argv[0]
.
Installation¶
Journald requires additional libraries that are not installed by default by Eliot. You can install them by running:
$ pip install eliot[journald]
Generating logs¶
The following example demonstrates how to enable journald
output.
"""
Write some logs to journald.
"""
from __future__ import print_function
from eliot import Message, start_action, add_destination
from eliot.journald import JournaldDestination
add_destination(JournaldDestination())
def divide(a, b):
with start_action(action_type="divide", a=a, b=b):
return a / b
print(divide(10, 2))
Message.log(message_type="inbetween")
print(divide(10, 0))
Querying logs¶
The journalctl
utility can be used to extract logs from journald
.
Useful options include --all
which keeps long fields from being truncated and --output cat
which only outputs the body of the MESSAGE
field, i.e. the JSON-serialized Eliot message.
Let’s generate some logs:
$ python journald.py
We can find all messages with a specific type:
$ sudo journalctl --all --output cat ELIOT_TYPE=inbetween | eliot-prettyprint
32ab1286-c356-439d-86f8-085fec3b65d0 -> /1
2015-09-23 21:26:37.972403Z
message_type: inbetween
We can filter to those that indicate errors:
$ sudo journalctl --all --output cat --priority=err ELIOT_TYPE=divide | eliot-prettyprint
ce64eb77-bb7f-4e69-83f8-07d7cdaffaca -> /2
2015-09-23 21:26:37.972945Z
action_type: divide
action_status: failed
exception: exceptions.ZeroDivisionError
reason: integer division or modulo by zero
We can also search by task UUID, in which case eliot-tree
can also be used to process the output:
$ sudo journalctl --all --output cat ELIOT_TASK=ce64eb77-bb7f-4e69-83f8-07d7cdaffaca | eliot-tree
ce64eb77-bb7f-4e69-83f8-07d7cdaffaca
+-- divide@1/started
|-- a: 10
|-- b: 0
`-- timestamp: 2015-09-23 17:26:37.972716
+-- divide@2/failed
|-- exception: exceptions.ZeroDivisionError
|-- reason: integer division or modulo by zero
`-- timestamp: 2015-09-23 17:26:37.972945