Jotting Table Of Contents

Outlets

We can configure where jotting sends logs by choosing new “outlets”. Outlets can be any callable object, but we can also use builtin outlets from jotting.to in order to save logs to a file:

import requests
from jotting import book, to

book.distribute(to.File(path="~/Desktop/logbox.txt"))


# we can format the title with
# the inputs of the function
@book.mark("getting {url}")
def get_url(url):
    r = requests.get(url)
    r.raise_for_status()
    return r


response = get_url("https://google.com")

Now we will find a logbox.txt file on our desktop with the following contents:

{"metadata": {"title": "getting https://google.com", "timestamps": [1519973286.701371], "tag": "d6154a2a16db4561b151fc43b3781f75", "parent": null, "status": "started"}, "content": {"url": "https://google.com"}}
{"metadata": {"title": "getting https://google.com", "timestamps": [1519973286.701371, 1519973286.991931], "tag": "d6154a2a16db4561b151fc43b3781f75", "parent": null, "status": "success", "stop": 1519973286.991928}, "content": {"returned": "<Response [200]>"}}

In all the examples we’ve seen so far, jotting has produced clean nested tree of log statements. However, these saved logs show us that under the hood jotting isn’t magic - each log is a dictionary that contains the information required to reconstruct a history of actions.

Your Own Outlets

You can make your own outlets with the jotting.to.outlet() decorator. The decorator takes in functions and returns a new jotting.to.Outlet class. It expects functions of the form (log, *args, **kwargs) where log is a formatted log string generated by a user, and *args, **kwargs were the parameters that construct the outlet instance. Given this, we can easily recreate the jotting.to.File outlet:

import os
from jotting.to import outlet


@outlet
def File(log, path):
    path = os.path.realpath(os.path.expanduser(path))
    with open(path, "a+") as f:
        f.write(log)

or the jotting.to.Print outlet:

import sys
from jotting.to import outlet


@outlet
def Print(log):
    """Send logs directly to ``sys.stdout``"""
    sys.stdout.write(log)
    sys.stdout.flush()