<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<html><body style='font-family: Verdana,Geneva,sans-serif'>
<!-- html ignored --><!-- head ignored --><!-- meta ignored -->
<div dir="ltr">Eliot is a logging system designed not only for simple applications but for complex applications as well, including distributed systems. Eliot supports simple structured messages but can also record a causal chain of actions happening within and across process boundaries: a logical trace of the system's operation.
<div class="gmail_quote">
<div dir="ltr">
<p>Structured, action-oriented logging is a great help when debugging problems. For example, here are the combined logs of a request originating from a client process being sent to a server. Notice how easy it is to figure out the cause of the problem, even though it's opaque to the client:</p>
<div style="margin-left: 40px;"> </div>
<pre style="margin-left: 40px;">process='client' task_uuid='40be6df2' task_level=[1] action_type='main'
    action_status='started'

process='client' task_uuid='40be6df2' task_level=[2, 1] action_type='http_request'
    action_status='started' x=5 y=0

process='server' task_uuid='40be6df2' task_level=[2, 2, 1] action_type='eliot:remote_task'
    action_status='started'

process='server' task_uuid='40be6df2' task_level=[2, 2, 2, 1] action_type='divide'
    action_status='started' x=5 y=0

process='server' task_uuid='40be6df2' task_level=[2, 2, 2, 2] action_type='divide'
    action_status='failed' exception='exceptions.ZeroDivisionError' reason='integer division or modulo by zero'

process='server' task_uuid='40be6df2' task_level=[2, 2, 3] action_type='eliot:remote_task'
    action_status='failed' exception='exceptions.ZeroDivisionError' reason='integer division or modulo by zero'

process='client' task_uuid='40be6df2' task_level=[2, 3] action_type='http_request'
   action_status='failed' exception='requests.exception.HTTPError' reason='500 Server Error: INTERNAL SERVER ERROR'

process='client' task_uuid='40be6df2' task_level=[3] action_type='main'
   action_status='failed' exception='requests.exception.HTTPError' reason='500 Server Error: INTERNAL SERVER ERROR'<br /><br /></pre>
<div>
<h2><span>What's New in 0.6.0</span></h2>
<div>
<p>Incompatible output format change! In previous versions the ordering of messages and actions was ambiguous and could not be deduced from out-of-order logs, and even where it was possible sorting correctly was difficult. To fix this the <tt><span>action_counter</span></tt> field was removed and now all messages can be uniquely located within a specific task by the values in an <a href="http://eliot.readthedocs.org/en/0.6.0/fields.html#task-fields"><em>improved task_level field</em></a>.</p>
</div>
<p>Features:</p>
<ul>
<li>Eliot tasks can now <a href="http://eliot.readthedocs.org/en/0.6.0/threads.html#cross-process-tasks"><em>span multiple processes and threads</em></a>, allowing for easy tracing of actions in distributed applications.</li>
<li><a href="http://eliot.readthedocs.org/en/0.6.0/output.html#add-global-fields"><em>eliot.add_global_fields</em></a> allows adding fields with specific values to all Eliot messages logged by your program. This can be used to e.g. distinguish between log messages from different processes by including relevant identifying information.</li>
</ul>
<p>Bug fixes:</p>
<ul>
<li>On Python 3 files that accept unicode (e.g. <tt><span>sys.stdout</span></tt>) should now work.</li>
</ul>
</div>
<p> </p>
<p>Downloads are available on <a href="https://pypi.python.org/pypi/eliot">PyPI</a>.</p>
<p>Documentation can be found on <a href="https://eliot.readthedocs.org/">Read The Docs</a>.</p>
<p>Bugs and feature requests should be filed at the project <a href="https://github.com/ClusterHQ/eliot">Github page</a>.</p>
<p>You can ask for help on IRC at the <tt>#eliot</tt> channel on <tt><a href="http://irc.freenode.net">irc.freenode.net</a></tt>.</p>
</div>
</div>
</div>
<div> </div>
</body></html>